Zend_Session: очистить $ _SESSION перед вызовом start - PullRequest
0 голосов
/ 05 октября 2011

Допустим, веб-приложение хранит объект класса My_Object в сеансе php под именем «myobject».Когда я открываю другое приложение php, где этот класс не существует, Zend_Session :: start () выдает исключение при попытке десериализации My_Object.

Таким образом, мне нужно очистить переменную $ _SESSION, чтобы избавиться от 'MyObject.Но чтобы очистить переменную $ _SESSION, мне сначала нужно вызвать session_start (), и, как только она была вызвана, Zend_Session :: start () выдает следующее исключение:

Неполученное исключение 'Zend_Session_Exception' with message 'Сессия уже была запущена с помощью session.auto-start или session_start () '

Это выбрасывается, даже если я вызываю session_destroy () перед вызовом Zend_Session :: start ().

Может ли кто-нибудь помочь мне в этом?

Заранее спасибо,

Эрик.

РЕДАКТИРОВАТЬ: Чтобы добавить пояснения, вот функция, которую я вызываю на моем плагине инициализатора контроллера:

    protected function _initSession() {
        try {
            session_start();

            unset($_SESSION['myobject']);

            session_destroy();

            Zend_Session::start(); // throws an exception !!!
        }
        catch (Exception $e) {
            echo $e; exit;
        }
    }

РЕДАКТИРОВАТЬ 2:

Чтобы добавить дополнительные пояснения, вот исключение, которое выдает Zend_Session :: start (), когда он встречает неизвестный класс:

Предупреждение: include_once (My / Object.php): не удалось открыть поток: нет такого файла или каталога в /usr/local/zend/share/ZendFramework/library/Zend/Loader.php в строке 146

Теперь, когда я написал это, яИнтересно, смогу ли я начать сеанс до запуска автозагрузчика Zend ...

Ответы [ 3 ]

1 голос
/ 06 октября 2011

Какую версию Zend Framework вы используете?

Справочное руководство гласит:

Использование сессий с объектами

Есливы планируете сохранять объекты в сеансе PHP, знать, что они будут »сериализованы для хранения.Таким образом, любой объект, сохраненный в сеансе PHP, должен быть не сериализован при извлечении из хранилища. Подразумевается, что разработчик должен убедиться, что классы для постоянных объектов должны быть определены до того, как объект будет не сериализован из хранилища сеансов. Если класс не сериализованного объекта не определен, то он становится экземпляром stdClass.

Похоже, что одним из возможных обходных путей было бы включить исходный файл для объекта, сериализованного в сеансе, чтобы он не сталкивался с этой ошибкой.Но в нем также говорится, что если класс не определен, он становится экземпляром stdClass, поэтому, поскольку это не то поведение, которое вы видите, это похоже на ошибку или вы используете более старую версию.

1 голос
/ 06 октября 2011

ОК, извините за ответ на мой собственный вопрос, но похоже, что я неправильно понял исключение, выданное Zend_Session. Проблема на самом деле возникла из Zend_Loader, а не из основного сеанса PHP. Дело в том, что я инстанцировал автозагрузчик Zend в index.php, что не очень хорошая идея, поскольку с момента его инстанции Zend_Loader будет пытаться автозагрузить каждый класс, который не был явно включен [РЕДАКТИРОВАТЬ: Чтобы быть более понятным, он будет попробуйте создать экземпляр каждого класса, имя которого начинается с одного из зарегистрированных пространств имен - и в моем коде у меня было зарегистрировано пространство имен "My_" в загрузчике zend ...]

Решение довольно простое: создать экземпляр Zend_Loader после Zend: Session :: start (). Я просто помещаю инициализацию Zend_Loader в мой загрузчик, после Zend_Session :: start (), и все работает безупречно: класс My_Object не идентифицирован Zend_Session :: start () как stdClass (спасибо drew010 за указание в правильном направлении); что является исключением.

Спасибо за вашу помощь, ребята.

0 голосов
/ 05 октября 2011

Судя по звукам ошибки, проблема не в том, что объект, а в том, как вы начинаете сеанс.

"Сеанс необработанного исключения 'Zend_Session_Exception' с сообщением" уже запущен session.auto-start или session_start (); "

protected function _initSession() {
    try {
        **session_start();**

        unset($_SESSION['myobject']);

        session_destroy();

        **Zend_Session::start();** // throws an exception !!!
    }
    catch (Exception $e) {
        echo $e; exit;
    }
}

В этом коде вы вызываете session_start(), а затем используете Zend_Session::start().

Это означает, что сеанс Zend вызывает исключение, если сеансы уже были вызваны ранее.

Вы могли бы просто поймать исключение и просто ничего не делать с ним?

protected function _initSession() {
    try {
        session_start();

        unset($_SESSION['myobject']);

        session_destroy();

        Zend_Session::start(); // throws an exception !!!
    }
    catch (Exception $e) {
        echo $e; exit;
    }
    catch (Zend_Session_Exception $zendException)
    {
         // Do nothing, ignore exception
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...