我的要求是,当用户代理更改会话应该销毁时,它应该启动新会话。但是如果在start()之前调用destroy,则Zend_Session :: 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
}
答案 0 :(得分:2)
伙计我已经解决了我的自我
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));
}
答案 1 :(得分:1)
您为什么要重新启动会话?只需在致电destroy()
编辑:
Zend_Session与常规php会话的工作方式不同,因此在vanilla 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中注释掉这段代码,看看它是如何表现的,尽管很有可能这是出于特定原因。