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