Intereting Posts
Как обращаться с выходом пользователя в браузере с несколькими вкладками? Чтение данных в последовательном порту на окнах с php PHP: количество последовательных элементов в массиве Symfony 2.8: Doctrine getManagerForClass () не возвращает правильный Entity Manager Ожидаемый код ответа 220, но получил код «», с сообщением «» в Laravel Управление файлами Zend Framework Связанные с Magento образцы цвета продукта Как получить текущее местоположение пользователя с помощью Google Geocode API и PHP как перемещать веб-сайт, созданный с помощью xampp (windows), на сервер хостинга Печать многомерного массива в таблице с использованием For loop Xamarin / PHP, я хочу сделать мой Jarray в JObject, либо в C # (Xamarin), либо в моем PHP-коде Как узнать, когда пользователь закрывает браузер? Приложение чата Magento: как включить php-вызов на страницах CMS На странице редактирования выберите выбранную радиокнопку WP_Query не возвращает результатов

Zend_Session: очистить $ _SESSION до начала вызова

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

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

Необязательное исключение «Zend_Session_Exception» с сообщением «сеанс» уже запущен session.auto-start или session_start ()

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

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

Спасибо заранее,

Эрик.

EDIT: Чтобы добавить пояснения, вот функция, которую я вызываю в моем плагине инициализатора контроллера:

protected function _initSession() { try { session_start(); unset($_SESSION['myobject']); session_destroy(); Zend_Session::start(); // throws an exception !!! } catch (Exception $e) { echo $e; exit; } } 

EDIT 2:

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

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

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

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

В справочном руководстве указано следующее:

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

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

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

ОК, извините за ответ на мой собственный вопрос, но похоже, что я неправильно понял исключение, вызванное Zend_Session. Проблема действительно исходила от Zend_Loader, а не для основной сессии PHP. Дело в том, что я запускал автозагрузчик Zend в index.php, что не является хорошей идеей, так как с момента его создания Zend_Loader будет пытаться автоматически загружать каждый класс, который не был явно включен. [EDIT: Чтобы быть более четким, он будет попробуйте инициализировать каждое имя класса whode начинается с одного из зарегистрированных имен – и в моем коде у меня было пространство имен «My_», зарегистрированное в загрузчике zend …]

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

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

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

«Uncaught exception» 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; } } с 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() , а THEN – с помощью 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 } } с 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 } }