Сессии
Управляющие функции
🕛 01.11.2006, 13:39
Сессии позволяют реализовать единый механизм передачи данных между страницами сайта. Программная реализация имеется в библиотеке PHPLIB, но в РНР есть встроенная. Сессии работают по следующей схеме. Пользователю, впервые посетившему сайт, присваивается уникальный идентификатор (идентификатор сессии). Этот идентификатор может быть сохранен в cookie (но не все браузеры их поддерживают) или в строке URL (тогда необходимо вносить значение идентификатора во все внутренние ссылки сайта, имеющиеся на каждой странице сайта).
Затем инициализируется массии, в котором будут храниться данные текущей сессии. Обычно данные сессии хранятся на сервере в файлах или базе данных.
В сценарии используются две основные функции: открытие сессии и внесение значения неременной в данные сессии.
При открытии сессии автоматически извлекаются ранее сохраненные переменные сессии.
При уничтожении сессии (обычно это делается автоматически, но прошествии времени устаревания) удаляются все се данные.
Внутренняя реализация сессий PIIP работает следующим образом. Если параметр конфигурации session.auto_start установлен (равен 1), то при запуске сценария сессия инициализируется автоматически (неявно вызывается функция session_start()). При этом проверяется существование идентификатора сессии и необходимость его создания.
Явно добавить переменную к данным сессии позволяет функция session_register().
Сохранение и восстановление переменных сессии определяется параметрами конфигурации track_vars (обычно он разрешен всегда) и register_globals.
Если параметр register_g"lobals разрешен, то переменные сессии автоматически преобразуются в глобальные и обратно (также их значения доступны в массиве $HTTP_SESSION_VARS).
<?php session_register
("count"): $count++: >>
Если параметр register_globals запрещен, то тогда переменные сессии сохраняются только в глобальном ассоциативном массиве $НТТР_ SESSIONJARS.
<?php session_register
("count");
$HTTP_SESSION_VARS
["count"l++: ?>
PHP может автоматически вносить идентификаторы сессий (SID) в строки локальных гиперссылок, если при компиляции был разрешен параметр -enable-trans-sid. Это бывает полезно, если браузер клиента не поддерживает cookie; иначе придется добавлять идентификаторы сессий в ссылки вручную.
<php? # <?=SID^>
- позволяет вывести идентификатор
сессии
# при интерпретации
заменяется на значение вида
# PHPSESSID=
-da07977e2f4cl52f973676c41d6bd9aa ?>
По умолчганию данные сессий сохраняются в файчах (в каталоге, указанном параметром конфигурации session.save path). Так заметно снижает быстродействие, можно использовать собственную функцию сохранения данных сессий (например, в БД) установив в качестве таковой с помощью функции session set save hand().
session_start
Инициализация данных сессии
bool session_start(void)
Создает массив данных сессии или сессии, переданный через cookie или в строке запроса, дарующая сессия уже существует) восстанавливает ранее сохраненные переменные сессии.
Функция всегда возвращает TRUE.
session_destroy
Уничтожение данных сессии
bool session_destroy(void);
session_ name
Определение имени сессии
string sessionjiame ([string name])
Возвращает имя текущей сессии, и если указан аргумент, то есть ее имя на указанное name.
Имя сессии является именем cookies, или например в строке запросом URL. Оно должно содержать цифровые символы. По умолчанию имя устанавливается параметром session.name , файле конфигурации. Если требуется измнить его в сценарии, это должно быть сделано до открытия сессии (вызова функций session_start() или session_register()).
<?php
Sprevious name = session_name
("WebsitelD"): echo "Ранее именем
сессии было $previous_name<p>"; ?>
session_module_name
Определение модуля работы с сессиями
string session_module_name ([string module])
Возвращает имя текущего модуля для работы с сессиями (обычно это встроенный в РНР модуль). Можно указать имя собственного модуля module, который должен использоваться вместо встроенного.
session_save_path
Определение каталога сохранения данных сессии string session_save_path ([string path])
По умолчанию РНР сохраняет данные сессий в файлах, в каталоге определенном конфигурацией. Функцией возвращается имя этого каталога, и если указан аргумент, то заданный ранее каталог изменяется на указанный.
session_ id
Определение значения идентификатора сессии string session_id ([string id])
Возвращает значение идентификатора текущей сессии; если указан аргумент, то заменяет его на указанное id (установить значение можно только до начала сессии).
Значение идентификатора также хранится в константе SID.
session_register
Добавление переменной сессии
bool session_register (mixed name [, mixed ...])
Возможно указание различного числа аргументов, содержащих имена переменных. Также можно указывать массив, содержащий имена переменных. Функция возвращает TRUE, если регистрация прошла успешно.
session_unregister
Удаление переменной сессии
bool session_unregister (string name)
Возвращается TRUE, если исключение переменной с именем name из данных сессии прошло успешно.
session_unset
Удаление всех переменных сессии
void session_unset(void);
Удаляет все данные текущей сессии.
session_ is_ registered
Проверка принадлежности переменной к текущей сессии
bool session_is_registered (string name)
Возвращает TRUE, если переменная с именем name принадлежит сессии.
session_get_cookie_params
Получение параметров cookie сессии
array session_get_cookie_pararas (void);
Возвращается массив, содержащий три элемента:
lifetime - время жизни cookie;
path - путь URL, для которого cookie действителен;
domain - домен, для которого cookie действителен.
session_ set_ cookie_ params
Установка параметров cookie сессии
void session_set_cookie_params (int lifetime [, string path [, string domain]]).
Параметры, которые устанавливаются этой функцией, будут действовать только на время исполнения сценария, в остальных случаях будут использоваться значения из параметров файла конфигурации php.ini.
session_decode
Декодирование данных сессии из строки
boo! session_decode (string data)
Эта функция используется для извлечения данных сессии, если строка сериалпзированных переменных была сохранена вручную.
session_encode
Кодирование данных сессии в строку
string session_encode(void)
Возвращает строку, содержащую сериализированные данные текущей сессии.
tession_set_save_handler
Установление пользовательских процедур работы с сессиями
void session_set_save_handler (string open, string close, string Aead, string write, string destroy, string gc)
Этой функцией можно установить функции, которые будут выполнять следующие действия: открытие сессии, закрытие, чтение и запись данных сессии, уничтожение устаревших данных, вычисление момента, когда следует удалять устаревшие данные. Имена соответствующих функций указываются в этом порядке, как аргументы данной функции. Для того чтобы можно было использовать пользовательские функции, следует установить для параметра session.save_ handler в файле конфигурации значение user.
Можно реализовать механизм сохранения данных сессий в базе данных. Следующий пример, демонстрирующий сохранение данных в файлах (примерно таким образом действует РНР), может быть лег- / ко преобразован для хранения данных в БД.
<?Php
// инициализация сессии
function open ($save_path. $sesston_name)
{ global $sess_save_path. $sess_session_name:
// здесь может выполняться подключение
к БД $sess_save_path = $save_path;
$sess_session_name -= $session_name: return(TRUE).
}
// закрытие сессии function close()
{ return(TRUE): }
// загрузка данных сессии function
read ($id) { global $sess_save_path.
$sess_session_name
$sess_file =
"$sess_save_path/sess_$id";
if ($fp = @fopen($sess_file. "r";)
{ $sess_data = fread
($fp. filesize($sess_file));
return($sess_data): } else {
returnC"'). }
// сохранение данных сессии
function write ($id. $sess_data) {
global $sess_save_path.
$sess_session_name:
$sess_file = "$sess_save_path/sess_$id":
if ($fp = @fopen($sess_file. "w"))
{ return (fwnte($fp, $sess_data));
} else { return(FALSE): }
} // уничтожение устаревших данных
сессии function destroy (Sid) {
global $sess_save_path.
$sess_session_name:
$sess_file = "$sess_save_path/sess_$id";
' return(@unlink($sess_file)); }
// здесь должны проверяться данные
сессии на истечение времени хранения
function gc (Smaxlifetime) {
return TRUE. }
session_set_save_handler
("open", "close", "read", "write",
"destroy", "gc"); session_start():
// далее следует обычная процедура
работы с сессиями ?>
session_cache_limiter
Определение ограничения кэширования
string session_cachejimiter ([string cachejimiter])
Когда посылаются заголовки HTTP, в них можно указать, разрешено ли кэширование полученных данных. В HTTP допустимы следующие значения: nocache (по умолчанию), private (относительное ограничение кэширования) и public (отсутствие ограничений). При запуске сценария ограничение кэширования устанавливается согласно значению параметра конфигурации session.cache_limiter.
Функция возвращает текущее ограничение кэширования, и если указан аргумент cachejli miter, то устанавливает новое (это необходимо делать до запуска сессии).
<?php
session_cache_himter( 'private');
session_start (): ?>