Поддержка сессий в PHP заключается в способе сохранения некоторых данных между несколькими последовательными доступами.
Каждому посетителю сайта присваивается уникальный идентификатор, называемый идентификатором сессии (session id). Он хранится либо в cookie на стороне пользователя, либо передаётся через URL.
Поддержка сессий позволяет сохранять данные между запросами в суперглобальном массиве $_SESSION. В тот момент, когда посетитель получает доступ к сайту, PHP проверяет автоматически (если session.auto_start установлено в 1) или по запросу (явным образом через вызов session_start()), был ли определённый идентификатор сессии послан вместе с запросом. Если это так, восстанавливается сохранённое ранее окружение.
При включённом session.auto_start единственным способом помещения объектов в сессию останется загрузка описаний класса с помощью auto_prepend_file. В противном случае придётся выполнить сериализацию (serialize()) и десериализацию (unserialize()) объекта вручную.
$_SESSION (и все зарегистрированные переменные) сериализуются внутри PHP после выполнения запроса, используя обработчик сериализации, указанный в INI-опции session.serialize_handler. Зарегистрированные, но неопределённые переменные помечаются как неопределённые. При последующем доступе они не определяются сессионным модулем, если пользователь заново не определит их.
Так как сессионные данные сериализуются, то переменные с типом resource не могут храниться в сессиях.
Обработчики сериализации (php
и php_binary
) наследуют ограничения для register_globals.
Поэтому нельзя использовать числовые или строковые индексы содержащие
специальные символы (|
и !
).
Их использование приведёт к ошибкам по завершении скрипта.
У php_serialize
такие ограничения отсутствуют.
Замечание:
При работе с сессиями обратите внимание, что запись в сессии не создаётся до тех пор, пока переменная не будет зарегистрирована в суперглобальном массиве $_SESSION. Это правило действует вне зависимости от того, была ли сессия запущена с использованием функции session_start().