什么可以阻止Zend_Session :: setSaveHandler工作

时间:2014-06-13 10:19:28

标签: php zend-framework

我正在使用多个模块处理一个相当大的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)

1 个答案:

答案 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,只需在控制器或适当的基本控制器中创建它。