 | 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.outputphp.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 - записывает данные сессии и конец сессии
|  |