我正在使用多个模块处理一个相当大的zf1项目。我们需要将会话状态存储在数据库中以进行新部署。在快速谷歌之后,我们遇到了Zend_Session_SaveHandler_DbTable,并在http://framework.zend.com/manual/1.12/en/zend.session.savehandler.dbtable.html处遵循了简单的示例(几乎完全)。我已将代码放在我们的application / Bootstrap.php中,并检查了它的运行情况。但是,数据库表永远不会填充会话数据。
我认为稍后会在代码库中覆盖Zend_Session :: setSaveHandler但我找不到任何其他调用或者Zend_Session :: start();
有关可能出现的问题或如何进一步调查的任何建议?
使用更新的信息进行编辑:
这里是如何显示引导程序的相关部分,目前只是设置为开发模式。
protected function _initSessionDB()
{
$db = Zend_Db::factory('Pdo_Mysql', array(
'host' =>'localhost',
'username' => '****',
'password' => '****',
'dbname' => '****'
));
Zend_Db_Table_Abstract::setDefaultAdapter($db);
$config = array(
'name' => 'session_state',
'primary' => 'id',
'modifiedColumn' => 'modified',
'dataColumn' => 'data',
'lifetimeColumn' => 'lifetime'
);
Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));
Zend_Session::start();
}
并且数据库有
mysql> explain session_state;
+----------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+-------+
| id | char(32) | YES | | NULL | |
| modified | int(11) | YES | | NULL | |
| lifetime | int(11) | YES | | NULL | |
| data | text | YES | | NULL | |
+----------+----------+------+-----+---------+-------+
4 rows in set (0.00 sec)
答案 0 :(得分:0)
事实证明,我正在处理的应用程序在应用程序/ Bootstrap中设置了FlashMessenger控制器助手。
protected function _initAutoload()
{
Zend_Controller_Action_HelperBroker::addHelper(
new Zend_Controller_Action_Helper_FlashMessenger());
}
FlashMessenger
动作帮助器会自动调用Zend_Session::start();
,这似乎比以后的任何调用优先。
简单的解决方案是在创建$this->bootstrap('sessionDB');
之前添加FlashMessenger
调用。例如,
protected function initFlashMessenger()
{
$this->bootstrap('sessionDB');
if (APPLICATION_ENV != 'testing')
Zend_Controller_Action_HelperBroker::addHelper(
new Zend_Controller_Action_Helper_FlashMessenger());
}
更好的解决方案是根本不在引导程序中创建FlashMessenger,只需在控制器或适当的基本控制器中创建它。