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