我的应用程序不是基于MVC模式构建的,而是部分使用Zend Framework组件,如Config,Loader,Session,Auth,Service和XmlRpc。
最近我发现,在某些情况下,如果用户浏览页面太快或按 F5 太快,他的会话将被销毁,他将被退出系统。有一个similar question,但他的解决方案并没有帮助我解决这个问题。
会话配置:
cookie_domain = ".mydomain.com"
name = "myApplicationName"
remember_me_seconds = 864000
save_path = "/path/to/my/session/storage/"
save_handler = "files"
strict = true
use_only_cookies = true
页面初始化:
$config = new Zend_Config_Ini(CONFIG_DIR . 'session.ini');
Zend_Session::setOptions($config->toArray());
Zend_Session::start();
帐户管理员:
function __construct(...)
{
/**
* @var $session Zend_Session_Namespace
*/
$session = Zend_Registry::get('Zend_Auth');
if(isset($session->identity))
{
Zend_Session::rememberMe();
}
}
退出流程:
if(isset($_GET['logout']))
{
Zend_Session::destroy(TRUE);
}
是否有其他人遇到过这个问题并且有一些线索可能有什么问题以及如何解决?
我已禁用Zend_Session::rememberMe()
,现在一切正常。据我了解,在每个请求中,此方法刷新session_id
并重命名会话文件,并且由于读/写性能问题,它无法找到新创建的会话,并且由于该会话处理程序丢失。
只是想知道,将会话存储更改为数据库是否可以解决此问题?
答案 0 :(得分:2)
我在使用原始PHP之前遇到过这个问题。问题是session_regenerate_id()
被过于频繁地调用(每个HTTP请求)。
检查某些内容(无论是Zend框架还是其他代码)是否正在重新生成会话ID。您可能遇到了HTTP竞争条件,其中获取的ID并不像PHP期望的那样新。
答案 1 :(得分:0)
我使用它并没有遇到过这个问题。我建议a)跟踪您的保存路径,看看是否有任何脚本修改此路径的权限b)仔细查看会话处理程序是否可以同时打开文件。
简单地说:Zend_Session本身并没有任何魔法,它是一个非常简单的包装器。