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

我已经做了一些研究,并没有find明确的答案。

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

我有几个问题,都是相互关联的,但最终我的问题是:“为什么PHP会话显然不应该在我们认为应该到期的时候过期?” 即最终用户应该在设定的时间之后退出应用程序,但不是。

这里是点,请帮助我连接他们,并告诉我我错在哪里:

  • 我的理解是,Memcache会根据设置的时间(以秒为单位)或者对于较大值的unix时间戳来过期键。
  • 到期是懒惰的 – 即没有事先被删除
  • PHP memecache会话处理程序使用sessions.gc_max_lifetime来设置memcache密钥到期。 idk,也许它不?
  • Memcache应该在提供请求的密钥并且已经过期的情况下不提供服务(也可以删除它)。 但至less不能服务。
  • 这种不服务它的行为应该等同于一个被删除的会话并且用户被注销。

用户没有被注销。

我怎样才能debugging呢? Memcache并不完全透明。

未运行的示例大小写是会话超时设置为两个小时的站点。 一个示例用户将在晚上持续使用该站点,然后在8-10小时后返回该站点并仍然login。

    我们也遇到过这种情况,但是已经设法深入了解并确切了解到底是怎么回事。 我们遇到的症状是memcache(在多个服务器上运行相当大的内存分配)开始驱逐内容。 这是不可取的,因为这会对现场的访问者造成不利影响。

    通过监控networkingstream量,我们看到从PHP到Memcache的消息如下:

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

    这是导致问题的第二个零 – 这决定了memcachecaching项目的时间长度。 通过将其设置为零,memcache永不过期此项目。 在你的情况下,这意味着用户可能会返回几个小时后继续访问您的网站。 在我们的例子中,memcache正在填满,导致所需的数据被驱逐。

    我进一步挖掘,它归结到PHP memcached扩展。 从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,并且修复了memcached库在https://bugs.php.net/bug.php?id=59641上有描述。

    我已经部署了这个补丁,检查了networkingstream量,发现它确实设置了到期时间。