Что может помешать работе Zend_Session::setSaveHandler

#php #zend-framework

#php #zend-framework

Вопрос:

Я работаю над достаточно большим проектом zf1 с несколькими модулями. Нам нужно сохранить состояние сеанса в базе данных для нового развертывания. После быстрого поиска в Google мы наткнулись на 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. Самый очевидный вопрос: если сеансы не сохраняются в БД, сохраняются ли они где-то еще; т.е. в файловой системе?

2. извините, что я должен добавить это к вопросу, они хранятся в расположении по умолчанию на бродячей машине, которое является /var/lib/php5/ sess_*

3. Итак, обработчик сохранения не используется. Можете ли вы добавить соответствующую часть начальной загрузки к вашему вопросу?

Ответ №1:

Получается, что приложение, над которым я работал, настраивает помощник контроллера FlashMessenger в application / Bootstrap.

 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 в начальной загрузке, а просто создать его в контроллерах или соответствующем базовом контроллере.