Сессии
Так как HTTP является stateless протоколом, то web-сервер не знает и не заботится о том, что два запроса идут от одного и того же пользователя. Поддержка сессий в PHP заключается в способе сохранения некоторых данных между несколькими последовательными запросами к веб-сайту.
Каждому посетителю сайта присваивается уникальный идентификатор, называемый идентификатором сессии (session id). Он хранится либо в cookie на стороне пользователя, либо передается через URL.
Поддержка сессий позволяет сохранять данные между запросами в суперглобальном массиве $_SESSION. В тот момент, когда посетитель получает доступ к сайту, PHP проверяет (автоматически, если session.auto_start установлено в 1, или по запросу явным образом через вызов session_start()), если определенный идентификатор сессии послан вместе с запросом. Если это так, восстанавливается сохраненное ранее окружение.
Обработчики сессий
По умолчанию сессии хранятся на диске, используя функции serialize() и unserialize() для обработки данных. Но есть возможность изменить обработчик сессий. Обработчик ответственнен за весь I/O - имеется в виду, что меняется кодирование и раскодирование.
Изменить обработчик можно как в php.ini директивой session.save_handler, так и вызовом функции session_set_save_handler(). По умолчанию значение session.save_handler равно files. Другие механизмы могут быть доступны через расширения. Например, memcache и memcached:
; memcached
session.save_handler = memcached
session.save_path = "host1:11211;host2:11211"
; memcache
session.save_handler = memcache
session.save_path = "tcp://host1:11211,tcp://host2:11211
Чтобы объявить свой обработчик через session_set_save_handler(), нужно определить несколько callback функций, каждую для открытия, закрытия, чтения, записи, уничтожения и сборки мусора. После версии PHP 5.4 стал доступен SessionHandlerInterface. Можно теперь просто определить класс, который реализует этот интерфейс и передать объект этого класса в session_set_save_handler().
class JsonSessionHandler
{
protected $save_path;
protected $file;
public function open($save_path, $session_id) {
$this->save_path = $save_path;
$this->file = $save_path
. DIRECTORY_SEPARATOR
. $session_id
. '.json';
return is_writable($save_path);
}
public function close() {
return is_writeable($this->file);
}
public function read($session_id) {
return json_decode(file_get_contents($this->file));
}
public function write($session_id, $data) {
return (bool) file_put_contents(json_encode($data));
}
public function destroy($session_id) {
unlink($this->file);
return !is_file($this->file);
}
public function gc($maxlifetime) {
$timeout = time() - $maxlifetime;
$files = glob($this->save_path
. DIRECTORY_SEPARATOR
. '*.json')
foreach ($files as $file) {
if (filemtime($file) < $timeout) {
unlink($file);
}
}
}
}
$handler = new JsonSessionHandler;
session_set_save_handler(
[$handler, 'open'],
[$handler, 'close'],
[$handler, 'read'],
[$handler, 'write'],
[$handler, 'destroy'],
[$handler, 'gc']
);
Функции
unset($_SESSION[‘name’])
- удалить переменную из сессии.
session_destroy()
- Уничтожает все данные сессии.
- Не удаляет session cookie.
session_start()
- Создает новую или возобнавляет предыдущую сессию.
session_id()
- Возвращает или устанавливает идентификатор сессии.
session_get_cookie_params()
- Возвращает массив с информацией о cookie текущей сессии.
session_set_cookie_params()
- Устанавливает параметры cookie текущей сессии.
session_regenerate_id()
- Обновляет текущий идентификатор сессии с новым сгенерированным значением.
- Данные сессии при этом сохраняются.
session_name()
- Возвращает или устанавливает имя текущей сессии.
- Если задан параметр $name то он будет текущем именем, а функция вернет старое имя.
session_write_close()
- Записывает данные в сессию и закрывает ее.
session_commit()
- Является псевдонимом session_write_close()
session_status()
- Возвращает статус сессии:
- PHP_SESSION_DISABLED, если механизм сессий отключен.
- PHP_SESSION_NONE, если механизм сессий включен, но сессия не создана.
- PHP_SESSION_ACTIVE, если механизм сессий включен и сессия создана.
session_reset()
- Откатывает изменения в $_SESSION до последних сохраненных значений в session storage.
Директивы
session.use_trans_sid
указывает, используется ли прозрачная поддержка sid или нет. По умолчанию 0 (отключено). (Идентификатор сессии передается в URL).