在数据库表中存储会话不起作用(使用 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)的主要内容,如果未能解决你的问题,请参考以下文章