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

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

Для начала нам понадобится создать таблицу sessions для хранения сессий:

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;

В классе Bootstrap объявим метод _initSessions():

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(); // запустим сессию
}

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

Для того, чтобы не возникло проблем при работе с Zend_Auth, необходимо объявить метод инициализации Zend_Auth после метода инициализации сохранения сессий. А также задать хранилище для хранения — Zend_Auth_Storage_Session.

protected function _initAuth()
{
    $auth = Zend_Auth::getInstance();
    $auth->setStorage(new Zend_Auth_Storage_Session());
    return $auth;
}

Либо, добавить

$this->_bootstrap('Session');
в начало метода _initAuth(). Это позволить вызвать метод _initSession первым.

Stas Kuryan

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

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

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