Пользовательские обработчики сессии
Для реализации хранилища данных (или любого иного хранилища) следует
использовать session_set_save_handler(), чтобы создать
набор пользовательских функций хранилища. Обработчики сессий можно создать,
используя класс SessionHandlerInterface, или расширить внутренние обработчики PHP,
унаследовав класс SessionHandler.
Функции обратного вызова, указанные в session_set_save_handler(), являются методами,
вызываемыми PHP в течение жизненного цикла сессии: open
, read
,
write
и close
и для служебных задач:
destroy
для удаления сессии и gc
для периодической
сборки мусора.
Следовательно, в PHP всегда необходимы обработчики, сохраняющие сессии. По умолчанию работает
внутренний обработчик 'files', сохраняющий сессии в файлы. Пользовательский обработчик может быть установлен,
используя функцию session_set_save_handler(). Альтернативные обработчики для сохранения сессии
также доступны в модулях PHP, таких как sqlite
,
memcache
и memcached
и могут быть установлены с помощью
session.save_handler.
Когда стартует сессия, PHP внутренне вызовет обработчик open
с последующим
вызовом обработчика read
, который должен вернуть закодированную строку - в точности такую,
какая передавалась для сохранения. После возвращения обработчиком read
закодированной строки, PHP
декодирует её и заполнит получившимся массивом суперглобальный массив $_SESSION.
Когда PHP завершает исполнение скрипта (или когда вызвана функция session_write_close()),
PHP внутренне закодирует суперглобальный массив $_SESSION, и передаст
эти данные с идентификатором сессии функции обратного вызова write
.
После того, как отработает функция обратного вызова write
, PHP внутренне вызовет
обработчик функции обратного вызова close
.
Когда сессия специально уничтожена, PHP вызовет обработчик destroy
с
идентификатором сессии.
PHP будет вызывать обработчик функции обратного вызова gc
время от времени,
чтобы пометить сессии как истёкшие в соответствии с временем жизни сессий.
Эта операция удалит все записи из постоянного хранилища, доступ к которым не осуществлялся
более чем интервал времени, указанный в параметре $lifetime
.