Учебник РНР
Назад Вперёд

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 определяют, как переменные сессии хранятся и восстанавливаются.

Примечание: в 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:

  • куки

  • параметр URL

Модель сессий поддерживает оба метода. Куки являются оптимальными, но, поскольку это ненадёжно (клиенты могут их не принимать), мы не можем полагаться на них. Второй метод внедряет 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. Мы дадим краткий обзор.

  • session.save_handler определяет имя обработчика хранения и запрашивания данных, ассоциированных с сессией. По умолчанию files.

  • session.save_path определяет аргумент, который передаётся для хранения обработчика. Если вы выбрали обработчик файлов по умолчанию, это будет путь к месту создания файлов. По умолчанию /tmp. Если глубина пути для session.save_path больше 2, сборка мусора не будет выполняться.

    Предупреждение!

    Если вы выставили этот набор в директории, доступной для всеобщего обозрения, такой как /tmp (по умолчанию), другие пользователи сервера смогут подключаться к сессиям, получив список файлов в этой директории.

  • session.name специфицирует имя сессии, которое используется как имя куки. Оно должно содержать только буквы и цифры. По умолчанию PHPSESSID.

  • session.auto_start специфицирует, стартует ли модуль сессий сессию автоматически при стартовом запросе. По умолчанию 0 (отключено).

  • session.cookie_lifetime специфицирует период хранения куки в секундах. Значение 0 означает "пока браузер не будет закрыт." По умолчанию 0.

  • session.serialize_handler определяет имя обработчика для сериализации/десериализации данных. В настоящий момент поддерживается внутренний формат PHP (name php) и WDDX (name wddx). WDDX доступен только тогда, когда PHP скомпилирован с поддержкой WDDX. По умолчанию php.

  • session.gc_probability специфицирует вероятность того, что утилита gc (garbage collection/сборщик мусора) стартует при каждом запросе, в процентах. По умолчанию 1.

  • session.gc_maxlifetime специфицирует количество секунд, после чего данные будут считаться 'мусором' и зачищаться.

  • session.referer_check содержит подстроку, которую вы можете проверять при каждом HTTP-обращении. Если обращение было выслано клиентом и подстрока не была найдена, внедрённый session id будет помечен как недействующий. По умолчанию - пустая строка.

  • session.entropy_file задаёт путь ко внешнему ресурсу (файлу), который будет использован как дополнительный источник в процессе создания session id. Примеры: /dev/random или /dev/urandom, которые доступны на многих Unix-системах.

  • session.entropy_length специфицирует количество байтов, которые будут прочитаны из файла специфицированного выше. По умолчанию 0 (отключено).

  • session.use_cookies специфицирует, будет ли модуль использовать куки для хранения session id на стороне клиента. По умолчанию 1 (включено).

  • session.use_only_cookies специфицирует, будет ли модуль использовать только куки для хранения session id на стороне клиента. По умолчанию 0 (отключено, для обратной совместимости). Включение этой установки предотвращает атаки при передаче session id в URL. Эта установка была добавлена в PHP 4.3.0.

  • session.cookie_path специфицирует путь для установки в session_cookie. По умолчанию /.

  • session.cookie_domain специфицирует домен для установки в session_cookie. По умолчанию нет ничего.

  • session.cache_limiter специфицирует метод управления кэшем для страниц сессии (none/nocache/private/private_no_expire/public). По умолчанию nocache.

  • session.cache_expire специфицирует период существования кэшированных страниц сессии в минутах, это не имеет эффекта при ограничителе nocache. По умолчанию 180.

  • session.use_trans_sid специфицирует, включена ли прозрачная поддержка sid, если включена при компиляции с опцией --enable-trans-sid . По умолчанию 1 (включено).

  • url_rewriter.tags специфицирует, какие тэги html перезаписываются для включения session id, если прозрачная поддержка sid включена. По умолчанию a=href,area=href,frame=src,input=src,form=fakeentry

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

Содержание
session_cache_expire - возвращает окончание действия текущего кэша
session_cache_limiter - получает и/или устанавливает текущий ограничитель кэша
session_decode - декодирует данные сессии из строки
session_destroy - уничтожает все данные, зарегистрированные для сессии
session_encode - шифрует данные текущей сессии как строку
session_get_cookie_params - получает параметры куки сессии
session_id - получает и/или устанавливает текущий session id
session_is_registered - определяет, зарегистрирована ли переменная в сессии
session_module_name - получает и/или устанавливает модуль текущей сессии
session_name - получает и/или устанавливает имя текущей сессии
session_readonly - начинает сессию - реинициализирует замороженные переменные, но не записывает в конец запроса
session_register - регистрирует одну или более переменных для текущей сессии
session_save_path - получает и/или устанавливает путь сохранения текущей сессии
session_set_cookie_params - устанавливает параметры куки сессии
session_set_save_handler - устанавливает функции хранения сессии уровня пользователя
session_start - инициализирует данные сессии
session_unregister - дерегистрирует переменную из текущей сессии
session_unset - освобождает все переменные сессии
session_write_close - записывает данные сессии и конец сессии

Назад Оглавление Вперёд
sesam_settransaction Вверх session_cache_expire