首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Memcache+PHP会话调优: memcache如何过期密钥?

Memcache+PHP会话调优: memcache如何过期密钥?
EN

Server Fault用户
提问于 2011-10-24 16:20:17
回答 1查看 11.9K关注 0票数 7

我对此做了一些研究,但没有找到明确的答案。

我们有一个使用PHP+Memcache会话处理程序的web应用程序。

我有几个相互关联的问题,但最终我的问题是,“为什么PHP会话在我们认为应该过期的时候没有过期呢?”也就是说,最终用户应该在设定的时间后退出应用程序,但不是。

这是点,请帮我把它们连接起来,告诉我哪里弄错了:

  • 我的理解是,Memcache基于设定的时间(以秒为单位)过期密钥(对于更大的值,则是unix时间戳)。
  • 过期是延迟的--也就是说,没有提前删除任何内容。
  • PHP会话处理程序使用sessions.gc_max_lifetime设置memcache密钥过期。伊克,也许不是?
  • 当服务请求的密钥并确保其过期时,Memcache应该不提供它(然后可能还会删除它?)。但至少不能为它服务。
  • 对于PHP来说,这种不提供服务的行为应该等同于已删除的会话和被注销的用户。

用户不会被注销。

我怎么能调试这个呢?Memcache并不完全透明。

没有工作的示例是将会话超时设置为两个小时的站点。一个示例用户将在夜间使用该站点,然后,8-10小时后,返回该站点并仍然登录。

EN

回答 1

Server Fault用户

发布于 2012-01-16 17:45:48

我们也遇到过这种情况,但我们设法挖掘了它,并确定了到底是怎么回事。我们遇到的症状是memcache (在多个服务器上运行相当大的内存分配)开始删除内容。这是不可取的,因为它可能会对网站上的当前访问者产生不利影响。

通过监视网络流量,我们看到从PHP到Memcache的消息如下:

设置memc.sess.key.abcdabcdabcdabcdabcdabcd 0 0 1823数据.

这是导致问题的第二个零,这决定了memcache缓存项目的时间长度。通过将其设置为零,memcache永远不会过期此项。在您的例子中,这意味着用户可以在数小时后返回并继续访问您的站点。在我们的例子中,memcache正在填充并导致想要的数据被逐出。

我进一步研究了一下,它可以归结为扩展。从1.0.2 (我们正在运行的)开始,这段代码如下:

代码语言:javascript
复制
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库的修复。

我已经部署了这个修补程序,检查了网络流量,发现它确实按照预期设置了过期时间。

票数 10
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/324326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档