Это моя таблица:
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.
Надеюсь, это поможет кому-то.