(PHP 4, PHP 5, PHP 7, PHP 8)
session_set_save_handler — Устанавливает пользовательские обработчики хранения сессии
$open,$close,$read,$write,$destroy,$gc,$create_sid = ?,$validate_sid = ?,$update_timestamp = ?Также возможно зарегистрировать следующий прототип:
session_set_save_handler() устанавливает пользовательские обработчики хранения сессии, которые используются для сохранения и получения данных, связанных с сессией. Это особенно полезно, когда предпочтительным является метод хранения, отличный от тех, которые предоставляются сессиями PHP, например, хранение данных сессии в локальной базе данных.
Данная функция имеет два определения (прототипа).
sessionhandlerЭкземпляр класса, реализующий интерфейс SessionHandlerInterface и необязательные SessionIdInterface и/или SessionUpdateTimestampHandlerInterface, такой как SessionHandler, для регистрации в качестве обработчика сессии.
register_shutdownЗарегистрировать session_write_close() как функцию register_shutdown_function().
openCallback-функция со следующей сигнатурой:
Callback-функция open работает как конструктор в классах и выполняется
при открытии сессии. Это первая callback-функция, которая выполняется,
когда сессия стартует автоматически либо вручную через session_start().
Возвращаемое значение true в случае успешного выполнения, false в случае неудачи.
closeCallback-функция со следующей сигнатурой:
Callback-функция close работает как деструктор в классах и выполняется
после того, как была вызвана callback-функция write. Она также вызывается
при вызове session_write_close().
Возвращаемое значение должно быть true в случае успешного выполнения, false в случае неудачи.
readCallback-функция со следующей сигнатурой:
Callback-функция read должна всегда возвращать кодированную (сериализованную)
строку сессии или пустую строку, если нет данных для чтения.
Эта callback-функция вызывается внутренним механизмом PHP при старте сессии или при вызове
session_start(). Перед тем, как будет вызвана эта callback-функция,
PHP вызовет callback-функцию open.
Возвращаемое значение данной callback-функции должно быть в точно таком же сериализованном формате,
который изначально передавался для хранения в callback-функцию write. Возвращаемое
значение будет автоматически десериализовано PHP и использовано для заполнения суперглобальной переменной
$_SESSION. Даже если данные похожи на результат serialize(), стоит
помнить, что это другой формат сериализации, который определён ini-директивой session.serialize_handler.
writeCallback-функция со следующей сигнатурой:
Callback-функция write вызывается, когда сессия должна быть сохранена и закрыта. Данная
callback-функция принимает идентификатор текущей сессии и сериализованную версию суперглобальной переменной
$_SESSION. Используемый внутри PHP метод сериализации определён ini-директивой
session.serialize_handler.
Переданные в эту callback-функцию сериализованные данные сессии должны быть сохранены в связи с переданным
идентификатором сессии. При получении этих данных, callback-функция read должна вернуть
то же самое значение, что было передано в callback-функцию write.
Данная callback-функция вызывается, когда PHP завершает работу или явно при вызове session_write_close().
Следует помнить, что после выполнения этой callback-функции, PHP выполнит callback-функцию close.
Замечание:
Обработчик "write" не выполнится до тех пор, пока выходной поток не будет закрыт. Таким образом, вывод отладочных операторов в обработчике "write" никогда не отобразится в браузере. Если необходим вывод отладочной информации, рекомендуется записывать отладочные данные в файл.
destroyCallback-функция со следующей сигнатурой:
Данная callback-функция вызывается, когда сессия уничтожается с помощью session_destroy()
или при вызове session_regenerate_id() с параметром destroy, установленным в true.
Возвращаемое значение должно быть true в случае успешного выполнения, false в случае неудачи.
gcCallback-функция со следующей сигнатурой:
Callback-функция сборщика мусора периодически вызывается PHP для очистки данных старых сессий.
Частота контролируется директивами session.gc_probability
и session.gc_divisor. Значение lifetime, которое передаётся
в данную callback-функцию может быть установлено в session.gc_maxlifetime.
Возвращаемое значение должно быть true в случае успешного выполнения, false в случае неудачи.
create_sidCallback-функция со следующей сигнатурой:
Данная callback-функция выполняется, когда требуется новый идентификатор сессии. Не предусматривает параметров, а возвращаемое значение должно быть строкой, которая является допустимым идентификатором сессии для вашего обработчика.
validate_sidCallback-функция со следующей сигнатурой:
Callback-функция выполняется, когда должна быть запущена сессия, предоставляется идентификатор сессии
и включается session.use_strict_mode.
key - это идентификатор сессии для проверки.
Идентификатор сессии действителен, если сессия с таким идентификатором уже существует.
Возвращаемое значение должно быть true в случае успешного выполнения или false в случае возникновения ошибки.
update_timestampCallback-функция со следующей сигнатурой:
Callback-функция выполняется при сессии.
key - это идентификатор сессии, val - это данные сессии.
Возвращаемое значение должно быть true в случае успешного выполнения или false в случае возникновения ошибки.
Функция возвращает true, если выполнилась успешно, или false, если возникла ошибка.
Пример #1 Пользовательский обработчик сессии: полный код смотрите в описании SessionHandlerInterface.
Здесь только продемонстрирован вызов session_set_save_handler, полный пример можно посмотреть в описании SessionHandlerInterface.
Заметьте, что с session_set_save_handler() мы используем ООП-прототип и регистрируем функцию завершения, используя флаг параметра функции. Это обычно рекомендуется при регистрации объектов в качестве обработчиков хранения сессии.
<?php
class MySessionHandler implements SessionHandlerInterface
{
// здесь реализация интерфейса
}
$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();
// устанавливаем и получаем значения по ключу из $_SESSION
Обработчики write и
close вызываются после деструктора объекта и
поэтому не могут использовать его контекст или бросать исключения. Исключения
не могут быть обработаны, так как не будут пойманы, не будет отражена трассировка
стека исключения и выполнение просто прекратится неожиданно. Однако при этом, деструкторы
объекта могут использовать сессии.
Можно вызвать session_write_close() из деструктора, чтобы решить эту проблему "курицы и яйца", но самый надёжный способ - это регистрировать функцию завершения, как описано выше.
Текущий рабочий каталог изменяется некоторыми SAPI, если сессия закрывается при завершении скрипта. Завершить сессию можно раньше с помощью session_write_close().