Поддержка сессий в 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 такие ограничения отсутствуют. php_serialize доступен начиная с PHP 5.5.4.
Замечание:
При работе с сессиями обратите внимание, что запись в сессии не создается до тех пор, пока переменная не будет зарегистрирована через функцию session_register() или через добавление нового ключа в суперглобальном массиве $_SESSION. Это правило действует вне зависимости от того, была ли сессия запущена с использованием функции session_start().
Замечание:
В PHP 5.2.2 была добавлена незадокументированная возможность, позволяющая хранить сессионные файлы в каталоге "/tmp", даже если open_basedir была включен и "/tmp" не был явным образом добавлен в список разрешенных путей. Эта особенность была убрана в PHP 5.3.0.