В предлагаемом материале рассказывается об управлении сессионными данными с помощью класса Zend_Session.
Быстрый старт
В веб приложениях,
написанных на PHP, сессия (session) представляет собой логическое соединение между сервером и клиентом (броузером). Класс Zend_Session помогает управлять и сохранять сессионные данные. В отличие от куков (cookies), сессия сохраняется на стороне сервера, а не на стороне клиента.
К сессионным данным
применима концепция пространства имен (namespace), что становится возможным благодаря классу Zend_Session_Namespace. Если необходимо манипулировать только одним пространством имен, работа может производиться в пространстве «по умолчанию».
Пример 20.1. Web Counter
<?php
$default = new Zend_Session_Namespace;
if (isset($default->count)) {
$default->count++;
} else {
$default->count = 1;
}
print $default->count;
Чтобы избежать конфликта имен, рекомендуется использовать индивидуальное пространство имен для однотипных данных.
$foo = new Zend_Session_Namespace('Foo');
Перебор сессионных данных в текущем пространстве имен может быть произведен при помощи стандартной контрольной структуры foreach.
foreach ($foo as $index => $value) { /* ... */ }
Использование
Начало сессии. Глобальное использование сессий со всеми запросами в пределах приложения можно при помощи статического метода Zend_Session::start(),
который следует вызывать в файле первоначальной загрузки. «Локальные» сессии могут быть начаты в любом месте приложения путем создания нового объекта класса Zend_Session_Namespace.
Zend_Session::start(); // in the bootstrap file
$default = new Zend_Session_Namespace; //
default namespace
$foo = new Zend_Session_Namespace('Foo');
Внимание
При
использовании Zend_Session не следует включать директиву session.auto_start или вызывать функцию session_start() напрямую.
Запирание пространства имен. Данные в текущем пространстве имен могут быть заперты для предотвращения их нежелательного изменения с помощью метода lock(). После запирания они все еще доступны в режиме «только
чтение». Запирание действует только на протяжении текущего запроса. Запирание может быть отменено с помощью метода unlock(). Проверить, заперты ли данные в текущем пространстве имен, можно с помощью метода isLocked().
<?php
$foo->lock();
if ($foo->isLocked()) {
$foo->unlock();
}
Продолжительность жизни. Данным в текущем пространстве имен может быть назначено время жизни, по истечении которого они считаются просроченными (expired). Это время может исчисляться в секундах (seconds) или т. н. «прыжках» (hops)
- успешных активациях пространства имен с помощью создания нового объекта класса Zend_Session_Namespace. Помимо всего пространства, время жизни может быть установлено и для отдельных входящих в него данных.
<?php
// all data will be expired in 10 seconds
$foo->setExpirationSeconds(10);
<?php
// the bar variable will be expired in 5 hops
$foo->setExpirationHops(5, 'bar');
Управление глобальными сессиями
Поведение сессий может быть изменено с помощью вызова ряда статических методов класса Zend_Session.
Метод Zend_Session::setOptions(). Настраивает поведение сессий, используя переданный массив конфигурационных опций.
Метод Zend_Session::regenerateId().
Изменяет идентификатор сессии, способствуя повышению безопасности приложения. Может быть вызван, например, в файле первоначальной загрузки. Не следует вызывать этот метод одновременно с методом rememberMe().
Метод Zend_Session::rememberMe(). Позволяет запомнить сессионные данные (обычно сессия уничтожается после закрытия пользователем броузера). Продолжительность запоминания в секундах передается в качестве параметра.
Метод
Zend_Session::forgetMe(). Нейтрализует действие метода Zend_Session::rememberMe().
Метод Zend_Session::sessionExists(). Позволяет выяснить, существует ли уже сессия для данного броузера и запроса.
Метод Zend_Session::destroy(). Разрушает все данные, ассоциированные с текущей сессией.
Контрольные вопросы и задания
Предложите способ нейтрализации установки директивы session.auto_start во включенное состояние в файле php.ini, к которому у вас нет доступа, перед вызовом статического метода Zend_Session::start().