| ||||||||||||||
XCII. Функции обслуживания сессийПоддержка сессий в PHP это способ сохранения определённых данных в течение последовательно выполняемых доступов. Это даёт возможность создать более специализированные приложения и увеличить привлекательность вашего web-сайта. Если вы знакомы с обслуживанием сессий с помощью PHPLIB, вы заметите, что некоторые вопросы аналогичны поддержке сессий в PHP. Посетителю вашего сайта присваивается уникальный id, так называемый session id. Он хранится в куке на стороне пользователя или вводится в URL. Поддержка работы с сессиями даёт вам возможность регистрировать произвольное количество переменных и сохранять их в промежутках между выполнениями запросов. Когда пользователь заходит на ваш сайт, PHP будет автоматически (если session.auto_start имеет значение 1) или по вашему запросу (явно - через session_start() или неявно - через session_register()) проверять, выслан ли специфический session id вместе с запросом. Если это так, воссоздаётся предшествующее окружение. Все зарегистрированные переменные сериализуются после окончания запроса. Зарегистрированные undefined-переменные маркируются как не определённые. При последующих запросах они не определяются модулем сессии, если только пользователь не определить их позднее. Установки конфигурации track_vars и register_globals определяют, как переменные сессии хранятся и восстанавливаются.
Если track_vars включена, а register_globals отключена, только члены глобального ассоциативного массива $HTTP_SESSION_VARS могут быть зарегистрированы как переменные сессии. Восстановленные переменные сессии будут доступны только в массиве $HTTP_SESSION_VARS.
Использование $_SESSION (или $HTTP_SESSION_VARS в PHP 4.0.6 или ранее) рекомендовано из соображений безопасности и читаемости кода. При наличии переменных $_SESSION или $HTTP_SESSION_VARS нет необходимости использовать функции session_register()/session_unregister()/session_is_registered(). Пользователи могут получать доступ к переменной сессии как к нормальной переменной.
Если register_globals включена, то все глобальные переменные могут быть зарегистрированы как переменные сессии, а переменные сессии будут восстанавливаться в соответствующие глобальные переменные. Поскольку PHP обязан знать, какие глобальные переменные зарегистрированы как переменные сессии, пользователь обязан регистрировать переменные функцией session_register(), в то время как $HTTP_SESSION_VARS/$_SESSION не должна использовать session_register().
Если track_vars и register_globals включены, то вхождения глобальных переменных и $HTTP_SESSION_VARS/$_SESSION будут ссылаться на то же самое значение для уже зарегистрированных переменных. Если пользователь применяет session_register() для регистрации переменной сессии, $HTTP_SESSION_VARS/$_SESSION не будет иметь эти переменные в массиве, пока он не будет загружен из хранилища сессии (т.е. до следующего запроса). Есть два метода хранения session id:
Модель сессий поддерживает оба метода. Куки являются оптимальными, но, поскольку это ненадёжно (клиенты могут их не принимать), мы не можем полагаться на них. Второй метод внедряет session id непосредственно в URL. PHP способен делать это прозрачно при компилировании с опцией --enable-trans-sid. Если вы включили эту опцию, относительные URI изменятся и будут содержать session id автоматически. Альтернативно вы можете использовать константу SID, которая определена, если клиент не отправил соответствующую куку. SID имеет форму session_name=session_id или пустой строки.
Следующие пример демонстрирует, как зарегистрировать переменную и как корректно связаться с другой страницей, используя SID.
<?=SID?> не нужен, если --enable-trans-sid использовалась при компиляции PHP.
Для реализации хранения в БД или другого метода вам понадобится использовать session_set_save_handler() для создания набора функций хранения уровня пользователя. Система менеджмента сессий поддерживает несколько опций конфигурации, которые вы можете поместить в ваш файл php.ini. Мы дадим краткий обзор.
| ||||||||||||||
|