Хранение сеансов в таблице DB не работает (с использованием Zend_Session_SaveHandler_DbTable)

Это моя таблица:

CREATE TABLE `Sessions` ( `id` varchar(32) NOT NULL, `modified` int(11) default NULL, `lifetime` int(11) default NULL, `data` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB 

Это в моем бутстрапе:

 $sessionConfig = array( 'name' => 'Sessions', //table name as per Zend_Db_Table 'primary' => 'id', //the sessionID given by php 'modifiedColumn' => 'modified', //time the session should expire 'dataColumn' => 'data', //serialized data 'lifetimeColumn' => 'lifetime' //end of life for a specific record ); $saveHandler = new Zend_Session_SaveHandler_DbTable($sessionConfig); //cookie persist for 30 days Zend_Session::rememberMe($seconds = (60 * 60 * 24 * 30)); //make the session persist for 30 days $saveHandler->setLifetime($seconds) ->setOverrideLifetime(true); //similarly, //$saveHandler->setLifetime($seconds, true); Zend_Session::setSaveHandler($saveHandler); Zend_Session::start(); 

Когда я вхожу в систему, ничто никогда не записывается в таблицу сеансов, и я выхожу из системы на следующей странице.

Есть идеи? Я пытаюсь, чтобы мои пользователи постоянно регистрировались. Возможно, я что-то пропустил в своем контроллере входа?

Мне просто удалось это сделать:

Мой application.ini:

 resources.db.isDefaultTableAdapter = true resources.db.adapter = "pdo_mysql" resources.db.params.host = "localhost" resources.db.params.dbname = "dbname" resources.db.params.username = "username" resources.db.params.password = "password" 

мой bootstrap.php:

 protected function _initSession() { $resource = $this->getPluginResource('db'); $dbAdapter = $db = $resource->getDbAdapter(); Zend_Registry::set("db", $dbAdapter); Zend_Db_Table_Abstract::setDefaultAdapter($dbAdapter); $config = array( 'name' => 'session', 'primary' => 'id', 'modifiedColumn' => 'modified', 'dataColumn' => 'data', 'lifetimeColumn' => 'lifetime', 'db' => $dbAdapter ); Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config)); Zend_Session::start(); } 

Эта функция была помещена как первая функция в bootstrap.php, поскольку сеансы запускаются при первом создании объекта Zend_Session_Namespace. Если вы это сделаете, перед вызовом функции _initSession (), можно запустить стандартный сеанс, основанный на файлах.

Наконец, session.sql:

 DROP TABLE IF EXISTS `session`; CREATE TABLE `session` ( `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; 

Где-то я читал, что таблица должна быть InnoDB.

Вы должны инициализировать обработчик БД, прежде чем сообщать Zend_Session о том, как использовать БД, либо путем установки адаптера по умолчанию для Zend_Db, либо передачи вашего адаптера в массиве config как «db».

Возможно, вам нужно поставить Zend_Session::start(); прежде чем что-либо еще на странице …?

Имел ту же проблему с реализацией redis как обработчик сеанса.

Для меня работает метод _initSession как первый метод в моем классе bootstrap.

Надеюсь, это поможет кому-то.