我对此做了一些研究,但没有找到明确的答案。
我们有一个使用PHP+Memcache会话处理程序的web应用程序。
我有几个相互关联的问题,但最终我的问题是,“为什么PHP会话在我们认为应该过期的时候没有过期呢?”也就是说,最终用户应该在设定的时间后退出应用程序,但不是。
这是点,请帮我把它们连接起来,告诉我哪里弄错了:
用户不会被注销。
我怎么能调试这个呢?Memcache并不完全透明。
没有工作的示例是将会话超时设置为两个小时的站点。一个示例用户将在夜间使用该站点,然后,8-10小时后,返回该站点并仍然登录。
发布于 2012-01-16 17:45:48
我们也遇到过这种情况,但我们设法挖掘了它,并确定了到底是怎么回事。我们遇到的症状是memcache (在多个服务器上运行相当大的内存分配)开始删除内容。这是不可取的,因为它可能会对网站上的当前访问者产生不利影响。
通过监视网络流量,我们看到从PHP到Memcache的消息如下:
设置memc.sess.key.abcdabcdabcdabcdabcdabcd 0 0 1823数据.
这是导致问题的第二个零,这决定了memcache缓存项目的时间长度。通过将其设置为零,memcache永远不会过期此项。在您的例子中,这意味着用户可以在数小时后返回并继续访问您的站点。在我们的例子中,memcache正在填充并导致想要的数据被逐出。
我进一步研究了一下,它可以归结为扩展。从1.0.2 (我们正在运行的)开始,这段代码如下:
sess_lifetime = zend_ini_long(ZEND_STRL("session.gc_maxlifetime"), 0);
if (sess_lifetime > 0) {
expiration = time(NULL) + sess_lifetime;
} else {
expiration = 0;
}在这个节选中,不返回期望值的是ZEND_STRL("session.gc_maxlifetime")。这已被报告为PHP的一个bug,https://bugs.php.net/bug.php?id=59641中描述了对memcached库的修复。
我已经部署了这个修补程序,检查了网络流量,发现它确实按照预期设置了过期时间。
https://serverfault.com/questions/324326
复制相似问题