memcache 和 memcached 会话无法持久

memcache 和 memcached 会话无法持久

因此,我在应用程序中遇到会话持久化问题,该应用程序使用 memcached php 驱动程序,而另一个现有应用程序正在使用 memcache 驱动程序。

在服务器上,我看到两者都已安装

我还在 php 配置中看到,已注册的保存处理程序包括 memcache 和 memcached,但是“session.save_handler”php 配置值设置为 memcache

这是否是会话在尝试使用 memcached 驱动程序的应用程序中无法工作的原因?或者这也应该有效,因为 memcached(虽然不是默认的)是一个已注册的保存处理程序。

我知道 memcached 守护进程和连接正在运行,因为我在使用 memcached 驱动程序时成功地在其中保存了缓存。

我该如何解决这个问题,它是否会在任何地方出现错误或日志?

答案1

检查您的 session.gc_maxlifetime 设置。任何大于 60*60*24*30 的值都将导致 memcache 在 PHP 存储会话密钥后立即将其过期。

Memcache 协议规定任何大于 60*60*24*30 的数字都将被视为绝对 unix 时间,而不是当前时间的偏移量:

某些命令涉及客户端向服务器发送某种到期时间(相对于项目或客户端请求的操作)。在所有这些情况下,发送的实际值可能是 Unix 时间(自 1970 年 1 月 1 日以来的秒数,32 位值),也可能是从当前时间开始的秒数。在后一种情况下,此秒数不得超过 60*60*24*30(30 天内的秒数);如果客户端发送的数字大于该数字,服务器将认为它是真正的 Unix 时间值,而不是当前时间的偏移量。

(看https://github.com/memcached/memcached/blob/e31a591210311d0658a90a86f71563fa6d7b095c/doc/protocol.txt#L79

PHP 会话处理程序仅使用 session.gc_maxlifetime 作为会话密钥的过期时间,而不对其进行任何更改。

详情请见:http://rcmachado.github.io/php/memcache/2014/07/23/php-memcached-gotchas.html(披露:该帖子是我写的)。

相关内容