Memcache正在耗尽PHP会话的内存

Memcache正在耗尽PHP会话的内存,php,zend-framework,memcached,amazon-elasticache,Php,Zend Framework,Memcached,Amazon Elasticache,我在AWS中有一个web层,运行Nginx+PHP fpm,在ElastiCache上使用memcache进行会话。在过去6个月左右的时间里,我们遇到了一个非常奇怪的问题,每隔6周左右,ElastiCache节点就会耗尽内存并开始逐出密钥,这会导致一些用户失去会话、注销,当然也会感到沮丧并失去他们在应用程序中的位置 我试过几种方法。一个是利用ini中的php memcached模块: session.save_handler = memcached session.save_path = "&l

我在AWS中有一个web层,运行Nginx+PHP fpm,在ElastiCache上使用memcache进行会话。在过去6个月左右的时间里,我们遇到了一个非常奇怪的问题,每隔6周左右,ElastiCache节点就会耗尽内存并开始逐出密钥,这会导致一些用户失去会话、注销,当然也会感到沮丧并失去他们在应用程序中的位置

我试过几种方法。一个是利用ini中的php memcached模块:

session.save_handler = memcached
session.save_path = "<aws elasticache dns:port>"
session.save\u handler=memcached
session.save_path=“”
是的,我验证了我实际使用的save_path url是正确的,并且正在接收网络连接。我还通过CloudWatch指标验证了缓存节点确实正在接收网络连接和数据

此配置不起作用,因此我将其替换为Zend framework会话管理器和保存处理程序。我通过
phpinfo()
验证了
session.save\u handler
已设置为
user
,还验证了浏览器是否获得了我在Zend会话中配置的正确cookie

尽管如此,我们还是遇到了与以下CloudWatch屏幕截图所示相同的问题:

内存中的垂直峰值我相信是由于memcache清除过期的密钥,这似乎每24小时发生一次。最后一个(最右侧)峰值是我重新启动节点的地方。奇怪的是,每次它清除键时,都不够清晰。最终,可用内存呈下降趋势,这会导致内存耗尽,memcache开始逐出密钥


我不知道会出现什么问题,也不知道下一步如何调试。有什么想法吗?谢谢

这不是bug,只是Memcached应该如何工作。由于缓存的本质,数据应该(相对)短暂。如果您当前的节点没有足够的内存来支持您试图存储的所有值,那么它别无选择,只能逐出键。如果您只存储会话,并且要填充整个缓存实例,那么最好的选择是升级缓存节点的大小(这需要很多会话!),或者在AWSs情况下,添加另一个节点

如果还要在缓存节点上存储其他数据,请为这些项设置智能过期时间,以便它们定期过期并释放空间

更新:我还想补充一点,如果你对使用cookie感到满意的话,使用一个有时间限制的cookie来重新创建丢弃的会话也是一个很好的补充。基本“保持我的登录”