如果页面请求太快,Zend Session 会被破坏
Posted
技术标签:
【中文标题】如果页面请求太快,Zend Session 会被破坏【英文标题】:Zend Session destroyed if page requested too quick 【发布时间】:2012-08-04 22:39:46 【问题描述】:我的应用程序不是基于 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
并重命名会话文件,并且由于读/写性能问题,它无法找到新创建的会话,并且由于该会话处理程序丢失。
只是想知道,将会话存储更改为数据库是否可以解决此问题?
【问题讨论】:
你有什么解决办法吗?我也面临同样的问题.. 【参考方案1】:我之前在使用原始 php 时遇到过这个问题。问题是 session_regenerate_id()
被调用太频繁(每个 HTTP 请求)。
检查是否有某些东西(无论是 Zend 框架还是其他代码)正在重新生成您的会话 ID。您可能遇到了一种 HTTP 竞争条件,它获得的 ID 并不像 PHP 所期望的那样新。
【讨论】:
【参考方案2】:我使用它并没有遇到过这个问题。我建议 a) 跟踪您的保存路径并查看是否有任何脚本修改了此路径的权限 b) 仔细查看会话处理程序是否可以同时打开文件。
简单地说:Zend_Session 本身并没有什么魔力,它是一个非常简单的包装器。
【讨论】:
会话保存路径已经指向一个自定义文件夹,我只是想知道这可能是文件系统问题,例如写入缓慢,因为Zend_Session::rememberMe()
确实在页面请求后一直更改 session_id。 以上是关于如果页面请求太快,Zend Session 会被破坏的主要内容,如果未能解决你的问题,请参考以下文章
致命错误:未捕获的异常 'Zend_Session_Exception' 带有消息 'Zend_Session::start()
A页面通过HttpWebRequest方面请求B页面时,B页面获取不到Session