php - 迁移到 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.
解决方案
增加“重试锁定会话锁的次数”会减少失败次数。
memcached.sess_lock_retries = 50
默认值为 5。
就我而言,当增加到至少 30 时,不会再发生错误。我已将其设置为 50,希望它就足够了。
推荐阅读
- python - 用于图像分割评估的骰子系数
- windows - 从非管理员用户以管理员身份运行进程 - 本地管理员凭据
- angular - 如何异步读取网页上的cookies?
- python - 退出 Visual Studio Code 时,Python 在 MacOS 上作为“失控”进程运行
- github - 我可以使用 GitHub API 提交视频吗?
- java - 在java中添加整数和双精度
- html - 使用 R Markdown 编织后,工具提示在浏览器中的位置错误
- maven - maven-dependency-plugin 解包目标:不要覆盖现有文件
- ruby-on-rails - 根据特定 ID 合并和求和哈希值,并保持剩余的哈希不变
- three.js - 访问 glTF 动画附加属性