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

Posted

技术标签:

【中文标题】在数据库表中存储会话不起作用(使用 Zend_Session_SaveHandler_DbTable)【英文标题】:Storing Sessions in DB Table Not Working (using Zend_Session_SaveHandler_DbTable) 【发布时间】:2010-12-10 22:09:07 【问题描述】:

这是我的桌子:

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 表,并且我在下一个页面浏览时退出。

有什么想法吗?我正在尝试让我的用户永久登录。我的登录控制器中是否可能缺少某些内容?

【问题讨论】:

【参考方案1】:

我刚刚设法让这个工作:

我的应用程序.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_Db_Table_Abstract::setDefaultAdapter($dbAdapter);和 'db' => $dbAdapter【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

我读到你想调用 Zend_Session::start();在一切之后。一个原因是从 rememberMe() 调用的 session_set_cookie_params() 无法设置会话启动后的生命周期。 即便如此,如果你在其他任何事情之前设置“Zend_Session::start();”,它会起作用吗?这可以为我们提供一些可能干扰的线索。 把 Zend_Session::start();之前的一切似乎都产生了相同的结果。有什么想法吗?【参考方案4】:

在将 redis 实现为会话处理程序时遇到了同样的问题。

对我来说,将方法 _initSession 作为我的引导类中的第一个方法是可行的。

希望对某人有所帮助。

【讨论】:

以上是关于在数据库表中存储会话不起作用(使用 Zend_Session_SaveHandler_DbTable)的主要内容,如果未能解决你的问题,请参考以下文章

TommEE 会话持久存储不起作用

快速护照会话不起作用

Laravel Redis 会话驱动程序不起作用

会话 cookie 在 Electron 中不起作用

如何在生产中设置快速会话。快速会话在 https 中不起作用

MYSQL 从存储过程中的临时表中选择 JOIN 不起作用