3 Kohana предоставляет пару классов, которые облегчают работу с куками и сессиями. На верхнем уровне и сессии, и куки обеспечивают одни и те же функции. Они позволяют разработчику хранить временную или постоянную инфомацию о конкретном клиенте для дальнейшего использования.
5 Куки следует использовать для хранения публичных (некритичных) данных, неизменных в течении длительного времени. Например, хранить идентификатор пользователя или предпочитаемый язык. Используйте класс [Cookie] для установки и получения кук.
7 [!!] Kohana работает с "подписанными" куками. Каждая хранимая кука содержит хэша для предотвращения подмены значения куки. Этот хэш генерируется методом [Cookie::salt], который учитывает свойство [Cookie::$salt]. Вам следует [изменить настройки](using.configuration), когда будете опубликовывать свое приложение.
9 Сессии лучше использовать для хранения временных или секретных данных. Крайне критичную информацию стоит хранить в классе [Session] с драйвером "database" или "native". Когда используется драйвер "cookie", сессия должна быть зашифрована.
11 [!!] Больше информации о работе с переменными сессии Вы можете получить в статье [семь смертных грехов сессий](http://lists.nyphp.org/pipermail/talk/2006-December/020358.html).
13 # Хранение, извлечение и удаление данных
15 [Cookie] и [Session] предоставляют очень схожий API для хранения данных. Главное отличие между ними в том, что доступ к сессии осуществляется как к объекту, а к кукам - как статическому классу (хэлпер).
17 Получить объект сессии можно посредством метода [Session::instance]:
19 // Get the session instance
20 $session = Session::instance();
22 Вы можете также получить все данные сессии с помощью метода [Session::as_array]:
24 // Get all of the session data as an array
25 $data = $session->as_array();
27 Также есть возможность переписать глобальную переменную `$_SESSION`. чтобы работать с сессиями в более привычном, стандартном для PHP стиле:
29 // Overload $_SESSION with the session data
30 $_SESSION =& $session->as_array();
33 $_SESSION[$key] = $value;
35 ## Хранение данных {#setting}
37 Для сохранения данных сессии или куки применяется метод `set`:
40 $session->set($key, $value);
43 Cookie::set($key, $value);
46 $session->set('user_id', 10);
47 Cookie::set('user_id', 10);
49 ## Получение данных {#getting}
51 Извлечение данных сессии или кук возможно посредством метода `get`:
54 $data = $session->get($key, $default_value);
57 $data = Cookie::get($key, $default_value);
60 $user = $session->get('user_id');
61 $user = Cookie::get('user_id');
63 ## Удаление данных {#deleting}
65 Метод `delete` позволяет удалить данные из сессии или кук:
67 // Delete session data
68 $session->delete($key);
74 $session->delete('user_id');
75 Cookie::delete('user_id');
77 # Настройка {#configuration}
79 И куки, и сессии имеют несколько параметров, которые влияют на механизм хранение данных. Всегда проверяйте их перед завершением приложения, так как многие из них будут напрямую влиять на безопасность Вашего приложения.
83 Все настройки изменяются через статические свойства. Вы можете изменить их либо через `bootstrap.php`, либо посредством [расширения классов](using.autoloading#class-extension).
85 Наиболее важный параметр это [Cookie::$salt], он используется для шифрования подписи. Значение необходимо поменять и держать в тайне:
87 Cookie::$salt = 'your secret is safe with me';
89 [!!] Изменение данного значения сделает недействительными все сохраненные ранее куки.
91 По умолчанию куки хранятся до закрытия браузера. Чтобы указать свое значение для времени жизни, измените параметр [Cookie::$expiration]:
93 // Set cookies to expire after 1 week
94 Cookie::$expiration = 604800;
96 // Alternative to using raw integers, for better clarity
97 Cookie::$expiration = Date::WEEK;
99 Адрес, с которого куки могут быть доступны, может быть ограничен параметром [Cookie::$path].
101 // Allow cookies only when going to /public/*
102 Cookie::$path = '/public/';
104 Домен, на котором куки будут доступны, указан в свойстве [Cookie::$domain].
106 // Allow cookies only on the domain www.example.com
107 Cookie::$domain = 'www.example.com';
109 Если Вы хотите сделать куку доступной для всех поддоменов, поставьте точку перед началом домена
111 // Allow cookies to be accessed on example.com and *.example.com
112 Cookie::$domain = '.example.com';
114 Чтобы разрешить куки только по защищенному (HTTPS) соединению, установите [Cookie::$secure] параметр.
116 // Allow cookies to be accessed only on a secure connection
117 Cookie::$secure = TRUE;
119 // Allow cookies to be accessed on any connection
120 Cookie::$secure = FALSE;
122 Защитите куки от доступа через Javascript, изменив параметр [Cookie::$httponly].
124 // Make cookies inaccessible to Javascript
125 Cookie::$httponly = TRUE;
127 ## Драйверы сессии {#adapters}
129 При создании или доступе к объекту класс [Session] Вы можете выбрать, какой драйвер использовать. Доступны следующие драйверы:
132 : Хранит данные в стандартном месте на диске web-сервера. Путь указывается в параметре [session.save_path](http://php.net/manual/session.configuration.php#ini.session.save-path) файла `php.ini` или переопределяется методом [ini_set](http://php.net/ini_set).
135 : Хранит информацию в базе данных с помощью класса [Session_Database]. Для работы требуется подключенный модуль [Database].
138 : Хранит данные в куках, с помощью класса [Cookie]. **Для данного драйвера предельный размер сессии будет равен 4Кб **
140 Драйвер по умолчанию может быть установлен в [Session::$default]. Изначально это драйвер "native".
142 [!!] Как и с куками, установка параметра "lifetime" в "0" означает, что сессия будет уничтожена после закрытия браузера.
144 ### Настройка драйвера сессии
146 Вы можете применить настройки для каждого драйвера, создав конфигурационный файл `APPPATH/config/session.php`. Следующий пример настроек определяет конфигурацию для каждого драйвера:
150 'name' => 'session_name',
154 'name' => 'cookie_name',
159 'name' => 'cookie_name',
162 'group' => 'default',
163 'table' => 'table_name',
165 'session_id' => 'session_id',
166 'last_active' => 'last_active',
167 'contents' => 'contents'
173 #### Драйвер Native {#adapter-native}
175 Тип | Параметр | Описание | По умолчанию
176 ----------|-----------|---------------------------------------------------|-----------
177 `string` | name | имя сессии | `"session"`
178 `integer` | lifetime | время жизни сессии (в секундах) | `0`
180 #### Cookie Adapter {#adapter-cookie}
182 Тип | Параметр | Описание | По умолчанию
183 ----------|-----------|---------------------------------------------------|-----------
184 `string` | name | имя куки, используемой для хранения сессии | `"session"`
185 `boolean` | encrypted | шифровать данные с помощью [Encrypt]? | `FALSE`
186 `integer` | lifetime | время жизни сессии (в секундах) | `0`
188 #### Database Adapter {#adapter-database}
190 Тип | Параметр | Описание | По умолчанию
191 ----------|-----------|---------------------------------------------------|-----------
192 `string` | group | название группы [Database::instance] | `"default"`
193 `string` | table | имя таблицы, в которой хранить данные | `"sessions"`
194 `array` | columns | ассоциативный массив псевдонимов полей | `array`
195 `integer` | gc | дает 1:x шанс, что запустится сборка мусора | `500`
196 `string` | name | имя куки, используемой для хранения сессии | `"session"`
197 `boolean` | encrypted | шифровать данные с помощью [Encrypt]? | `FALSE`
198 `integer` | lifetime | время жизни сессии (в секундах) | `0`
200 ##### Структура таблицы
202 Вам придется создать таблицу для хранения сессии в базе данных. Вот структура по умолчанию:
204 CREATE TABLE `sessions` (
205 `session_id` VARCHAR(24) NOT NULL,
206 `last_active` INT UNSIGNED NOT NULL,
207 `contents` TEXT NOT NULL,
208 PRIMARY KEY (`session_id`),
209 INDEX (`last_active`)
214 Вы можете изменить имя полей, чтобы использовать существующую таблицу. По умолчанию используется имя ключа.
220 : метка времени UNIX для последнего времени обновления сессии
223 : данные сессии, хранимые в виде сериализованной и (необязательно) зашифрованной строки