Функции обслуживания сессий

Поддержка сессий в PHP это способ сохранения определённых данных в течение последовательно выполняемых доступов. Это даёт возможность создать более специализированные приложения и увеличить привлекательность вашего web-сайта.

Если вы знакомы с обслуживанием сессий с помощью PHPLIB, вы заметите, что некоторые вопросы аналогичны поддержке сессий в PHP.

Посетителю вашего сайта присваивается уникальный id, так называемый session id. Он хранится в куке на стороне пользователя или вводится в URL.

Поддержка работы с сессиями даёт вам возможность регистрировать произвольное количество переменных и сохранять их в промежутках между выполнениями запросов. Когда пользователь заходит на ваш сайт, PHP будет автоматически (если session.auto_start имеет значение 1) или по вашему запросу (явно - через session_start() или неявно - через session_register()) проверять, выслан ли специфический session id вместе с запросом. Если это так, воссоздаётся предшествующее окружение.

Все зарегистрированные переменные сериализуются после окончания запроса. Зарегистрированные undefined-переменные маркируются как не определённые. При последующих запросах они не определяются модулем сессии, если только пользователь не определить их позднее.

Установки конфигурации track_vars и register_globals определяют, как переменные сессии хранятся и восстанавливаются.

Примечание: в 4.0.3 track_vars всегда on.

Примечание: в PHP 4.1.0 $_SESSION доступна как глобальная переменная, совсем как $_POST, $_GET, $_REQUEST и так далее. В отличие от $HTTP_SESSION_VARS, $_SESSION всегда глобальна. Следовательно, global не должно использоваться для $_SESSION.

Если track_vars включена, а register_globals отключена, только члены глобального ассоциативного массива $HTTP_SESSION_VARS могут быть зарегистрированы как переменные сессии. Восстановленные переменные сессии будут доступны только в массиве $HTTP_SESSION_VARS.
Пример 1. Регистрация переменной при включённой track_vars
<?php
session_start();
if (isset($HTTP_SESSION_VARS['count'])) {
   $HTTP_SESSION_VARS['count']++;
}
else {
   $HTTP_SESSION_VARS['count'] = 0;
}
?>

Использование $_SESSION (или $HTTP_SESSION_VARS в PHP 4.0.6 или ранее) рекомендовано из соображений безопасности и читаемости кода. При наличии переменных $_SESSION или $HTTP_SESSION_VARS нет необходимости использовать функции session_register()/session_unregister()/session_is_registered(). Пользователи могут получать доступ к переменной сессии как к нормальной переменной.
Пример 2. Регистрация переменной с помощью $_SESSION
<?php
session_start();
// Используйте $HTTP_SESSION_VARS в PHP 4.0.6 или более старых версиях
if (!isset($_SESSION['count'])) {
    $_SESSION['count'] = 0;
} else {
    $_SESSION['count']++;
}
?>
Пример 3. Дерегистрация переменной с помощью $_SESSION
<?php
session_start();
// Используйте $HTTP_SESSION_VARS в PHP 4.0.6 или более старых версиях
unset($_SESSION['count']);
?>

Если register_globals включена, то все глобальные переменные могут быть зарегистрированы как переменные сессии, а переменные сессии будут восстанавливаться в соответствующие глобальные переменные. Поскольку PHP обязан знать, какие глобальные переменные зарегистрированы как переменные сессии, пользователь обязан регистрировать переменные функцией session_register(), в то время как $HTTP_SESSION_VARS/$_SESSION не должна использовать session_register().
Внимание!

Если вы используете $HTTP_SESSION_VARS/$_SESSION и отключили register_globals, не используйте session_register(), session_is_registered() и session_unregister().

Если вы включили register_globals<, должна использоваться session_unregister(), поскольку переменные сессии регистрируются как глобальные переменные, когда данные сессии десериализуются. Отключение register_globals рекомендуется по соображениям безопасности и производительности.

Пример 4. Регистрация переменной при включённой register_globals
<?php
if (!session_is_registered('count')) {
    session_register("count");
    $count = 0;
}
else {
    $count++;
}
?>

Если 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 или пустой строки.

Примечание: директива arg_separator.output php.ini позволяет специализировать разделитель аргументов.

Следующие пример демонстрирует, как зарегистрировать переменную и как корректно связаться с другой страницей, используя SID.
Пример 5. Подсчёт количества входов отдельного пользователя
<?php
if (!session_is_registered('count')) {
    session_register('count');
    $count = 1;
}
else {
    $count++;
}
?>

Hello visitor, you have seen this page <?php echo $count; ?> times.<p>;

<?php
# Тэг <?php echo SID?> (<?=SID?> можно использовать, если включены
# укороченные тэги/short tag) 
# нужна для сохранения session id
# в том случае, если данный пользователь отключил куки
?>

To continue, <A HREF="nextpage.php?<?php echo SID?>">click here</A>

<?=SID?> не нужен, если --enable-trans-sid использовалась при компиляции PHP.

Примечание: принимается, что не-относительные URL указывают на внешние сайты и, следовательно, не присоединяют SID, так как имеется риск утечки информации о SID на другой сервер.

Для реализации хранения в БД или другого метода вам понадобится использовать session_set_save_handler() для создания набора функций хранения уровня пользователя.

Система менеджмента сессий поддерживает несколько опций конфигурации, которые вы можете поместить в ваш файл php.ini. Мы дадим краткий обзор.

Примечание: работа с сессиями была добавлена в PHP 4.0.