我们也遇到过这种情况,但我们已经设法深入研究并确切地解决了正在发生的事情.我们遇到的症状是memcache(在多个服务器上运行的内存分配相当大)开始逐出内容.这是不可取的,因为它可能对网站上的当前访问者产生不利影响.
通过监控网络流量,我们看到了从PHP到Memcache的消息,如下所示:
设置memc.sess.key.abcdabcdabcdabcdabcdabcd 0 0 1823数据…
这是导致问题的第二个零 – 这决定了memcache缓存项目的时间长度.通过将其设置为零,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的错误,并且在https://bugs.php.net/bug.php?id=59641处描述了对memcached库的修复.
我已经部署了这个补丁,检查了网络流量,发现它确实按预期设置了到期时间.