Запись в Zend_Session_Namespace в destruct - PullRequest
2 голосов
/ 24 февраля 2011

Я заметил несколько неожиданное поведение при использовании __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)

1 Ответ

2 голосов
/ 24 февраля 2011

Это проблема курицы и яйца.Если прекращение сеанса оставалось до тех пор, пока все объекты не были уничтожены, то было бы невозможно использовать объект для обработчика сохранения сеанса.

Обходной путь register_shutdown_function подходит.Чтобы избежать запуска кода дважды, вы должны переместить код завершения сеанса в другую функцию, которую вы регистрируете.Ручной вызов __destruct () для объекта, который все еще существует, все равно кажется немного уродливым;)

...