Я заметил несколько неожиданное поведение при использовании __destruct
для записи данных с использованием Zend_Session_Namespace
в PHP 5.3:
public function __destruct(){
$this->getSession()->data = $this->data;
}
// ....
private function getSession()
{
if (! self::$zendSession) {
// this next line is fine because the object is a singleton
self::$zendSession = new Zend_Session_Namespace(self::SESSION_NAMESPACE);
}
return(self::$zendSession);
}
Деструктор вызывается, но данные не записываются. Однако, если я неявно вызываю destruct после того, как над объектом были выполнены все необходимые операции, и принудительно уничтожаю до завершения скрипта, данные записываются нормально, но я бы не стал этого делать.
Я предполагаю, что это как-то связано с этой ошибкой: http://bugs.php.net/29032 ( ошибка кажется мне немного старой), и на первый взгляд исправление выглядит хорошо (зарегистрируйте __destruct как функцию выключения, которая вызывается до того, как $_SESSION
станет недоступной), но разве деструктор не будет вызываться дважды (один раз через register_shutdown_function
и один раз автоматически?
Конечно, запись нечетного бита данных объекта в сеанс при завершении работы — это проблема, которая была решена? Что люди делают, когда это требуется?
(OSX 10.6.6, Apache 2.2.15 (Unix), PHP 5.3.3, Zend Framework 1.7.2)
zend_controller_action->_redirect()
, но я не хотел делать пост слишком неудобным для понимания. По сути, я заметил, что если есть цепочка запросов, использованиеzend_controller_action->_redirect()
для перехода к следующему приводит к выходу деструктора на строке, где он ссылается наZend_Session_Namespace
. Для последнего запроса в цепочке (гдеzend_controller_action->_redirect()
не вызывается, деструктор завершается нормально, и данные записываются в session. - person sennett   schedule 24.02.2011