在DB表中存储会话不起作用(使用Zend_Session_SaveHandler_DbTable)

时间:2009-10-28 15:49:11

标签: php mysql database zend-framework session

这是我的表:

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(); 

当我登录时,没有任何内容被写入Sessions表,我将在下一页浏览中注销。

有什么想法吗?我正在尝试让我的用户永久登录。我可能在登录控制器中遗漏了什么吗?

4 个答案:

答案 0 :(得分: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();
}

此函数作为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。

答案 1 :(得分:1)

在告诉Zend_Session使用数据库之前,必须初始化数据库处理程序,方法是为Zend_Db设置默认适配器,或者将配置数组中的适配器作为“db”传递。

答案 2 :(得分:0)

也许您必须先将Zend_Session::start();放在页面上的任何其他内容上??

答案 3 :(得分:0)

将redis的实现作为会话处理程序存在同样的问题。

对我来说,将方法_initSession作为第一个方法放在我的bootstrap类中。

希望它会对某人有所帮助。