Zend Framework: реализация хранения сессий в базе данных

Zend Framework: реализация хранения сессий в базе данных
Хранение сессий в файловой системе может стать серьезной проблемой, когда число пользователей проекта переваливает за несколько сотен тысяч. Стоит подумать об альтернативных способах хранения сессий. Одним из таковых является хранение сессий в БД. И я хотел бы рассказать о том, как реализовать хранение сессий в БД с использованием Zend Framework.

Для начала нам понадобится создать таблицу sessions для хранения сессий:
[sql] CREATE TABLE IF NOT EXISTS `sessions` (
`id` char(32) NOT NULL DEFAULT »,
`modified` int(11) DEFAULT NULL,
`lifetime` int(11) DEFAULT NULL,
`data` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
[/sql]

В классе Bootstrap объявим метод _initSessions():
[php] protected function _initSession()
{
$this->_bootstrap(‘db’); // устанавливает соединение к БД, параметры которой описаны в application.ini
$lifeTime = 1 * 24 * 60 * 60; // время жизни сессии — 1 день
$config = array(
‘name’ => ‘sessions’, // задаем имя таблицы, где будут хранится сессии
‘primary’ => ‘id’, // столбец первичного ключа
‘modifiedColumn’ => ‘modified’, // столбец, для хранения даты изменения сессии
‘dataColumn’ => ‘data’, // столбец для хранения данных
‘lifetimeColumn’ => ‘lifetime’ // столбец для хранения времени жизни сессии
);
Zend_Session::setOptions(array(
‘gc_probability’ => 1, // вероятность 1% запуска функции сборщика мусора (удаления данных)
‘gc_maxlifetime’ => $lifeTime // время, по истечению которого, данные могут быть удалены
));

Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config)); // установим обработчик сохранения сессий
Zend_Session::start(); // запустим сессию
}
[/php]

Все. После этого, все Ваши сессии будут сохраняться в таблице sessions.

Для того, чтобы не возникло проблем при работе с Zend_Auth, необходимо объявить метод инициализации Zend_Auth после метода инициализации сохранения сессий. А также задать хранилище для хранения — Zend_Auth_Storage_Session.
[php] protected function _initAuth()
{
$auth = Zend_Auth::getInstance();
$auth->setStorage(new Zend_Auth_Storage_Session());
return $auth;
}
[/php]

Либо, добавить
[php] $this->_bootstrap(‘Session’);
[/php] в начало метода _initAuth(). Это позволить вызвать метод _initSession первым.

Stas Kuryan

Web developer. Перфекционист в написании кода.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *