首页 > 解决方案 > 迁移到 PHP 7 后出现不一致的 Memcached PHP 会话读取错误

问题描述

我们正在将应用程序从 PHP 5.4 迁移到 PHP 7.3。该应用程序使用 memcached 存储会话数据,并使用 AJAX 请求显示会话相关信息。

  session.save_handler = memcached
  session.save_path = "localhost:11211"

并发AJAX 请求尝试读取会话时, Memcached 行为不一致,有些失败并出现错误:

session_start(): Failed to read session data: memcached (path: localhost:11211)

在同一页面上,重新加载页面时,相同的 AJAX 请求可能成功也可能失败

当应用程序使用PHP 5.4运行时,不会发生这种行为。

如果使用文件会话处理程序(默认值 php.ini):

  session.save_handler = files
  session.save_path = "/var/lib/php/sessions"

然后错误不再发生,所有请求都成功。

禁用会话锁定也解决了这个问题:

  memcached.sess_locking = Off

我不喜欢禁用会话锁定,因为它可能会导致其他并发访问问题。

有没有人有类似的经历或者知道出路?提前致谢

PS:以前可以正常工作的配置是

  Debian 7, PHP 5.4, memcached 2.0.1 and libmemcached 1.0.8

发生错误的新配置:

  Debian 9, PHP 7.3, memcached 3.1.13 and libmemcached 1.0.18.

标签: phpmemcached

解决方案


增加“重试锁定会话锁的次数”会减少失败次数。

  memcached.sess_lock_retries = 50

默认值为 5。

就我而言,当增加到至少 30 时,不会再发生错误。我已将其设置为 50,希望它就足够了。


推荐阅读