2009-10-28 2 views
5

Это мой стол:Сохранение сессий в БД таблицы не работает (с использованием 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(); 

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

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

ответ

0

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

+0

Я читал, что вы хотите вызвать Zend_Session :: start(); после всего остального. Одной из причин является session_set_cookie_params(), который вызывается из памятиMe(), не может установить время жизни после начала сеанса. – Brian

+0

Даже если вы установили'Zend_Session :: start(); 'прежде чем что-нибудь еще это сработает? Это может дать нам некоторые подсказки тому, что может мешать. – Frankie

+0

Ввод Zend_Session :: start(); Очевидно, что все, кажется, дает тот же результат. Есть идеи? – Brian

1

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

2

Я только что удалось получить эту работу:

Мой 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(); 
} 

Эта функция была помещена в качестве первой функции в начальной загрузки .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.

+0

Вам не нужны оба Zend_Db_Table_Abstract :: setDefaultAdapter ($ dbAdapter); и 'db' => $ dbAdapter – Kicsi

0

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

Для меня ставится метод _initSession как первый метод в моем классе загрузки.

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

Смежные вопросы