在数据库表不工作存储会话(使用Zend_Session_SaveHandler_DbTable)(S

2019-09-01 23:53发布

这是我的表:

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

当我登录时,从来都没有被写入到会话表,我登出的第二天浏览量。

有任何想法吗? 我试图让我的用户将永远登录。我缺少的东西在我登录控制器可能?

Answer 1:

我好不容易才得到这个工作:

我的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。



Answer 2:

你必须告诉Zend_Session组件,通过设置一个默认的适配器Zend_Db的,或者通过你的适配器配置阵列“DB”中使用DB之前初始化你的数据库的处理程序。



Answer 3:

也许你得把Zend_Session::start(); 页面上的任何东西之前...?



Answer 4:

与Redis的作为会话处理程序的实现有同样的问题。

对我来说,把方法_initSession作为第一种方法在我的引导类作品。

希望这将帮助别人。



文章来源: Storing Sessions in DB Table Not Working (using Zend_Session_SaveHandler_DbTable)