|
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().
Пример 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. Мы дадим краткий обзор. 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 - записывает данные сессии и конец сессии
| |