Мое требование: когда сеанс изменения пользовательского агента должен уничтожить, и он должен начать новый сеанс. Но Zend_Session :: start () бросает исключение, если destroy был вызван перед start ().
try { Zend_Session::start(); } catch (Zend_Session_Exception $e) { Zend_Session::destroy(true); Zend_Session::start(); // breaking here Zend_Session::regenerateId(); } Zend_Session::registerValidator(new Zend_Session_Validator_HttpUserAgent());
Исключить исключение «Zend_Session_Exception» с сообщением «Сессия была явно уничтожена во время этого запроса, попытка повторного запуска не разрешена». в библиотеке \ Zend \ Session.php: 431
РЕДАКТИРОВАТЬ:
Причина в том, что вторая команда start () молча игнорируется, если она уже была вызвана в этом запросе. Я опубликовал вопрос, надеюсь, они его принимают.
if (self::$_sessionStarted) { return; // already started }
Пожалуйста, проголосуйте
http://framework.zend.com/issues/browse/ZF-11420
Ребята, я решил это сам
try { Zend_Session::start(); } catch (Zend_Session_Exception $e) { Zend_Session::destroy(true); $this->bootstrap('frontController'); $front = $this->getResource('frontController'); $front->setRequest(new Zend_Controller_Request_Http()); $front->setResponse(new Zend_Controller_Response_Http()); $redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector'); $redirector->gotoUrl($front->getRequest()->getRequestUri(),array('prependBase' => false)); }
Почему вы пытаетесь перезапустить сеанс? Просто перенаправите пользователя на экран входа в систему после вызова destroy()
РЕДАКТИРОВАТЬ:
Zend_Session работает по-другому, чем обычные php-сессии, и, следовательно, почему это приемлемо в php ванили, а не в Zend Framework.
Проверка виновника находится здесь:
if (self::$_sessionStarted && self::$_destroyed) { require_once 'Zend/Session/Exception.php'; throw new Zend_Session_Exception('The session was explicitly destroyed during this request, attempting to re-start is not allowed.'); }
Вы можете попробовать прокомментировать этот фрагмент кода в Zend_Session и посмотреть, как он себя ведет, хотя его очень вероятно, что это было сделано по определенной причине.