更换服务器后用户$_SESSION随机丢失是否与session.gc_probability配置有关
问题解答
对参数的理解是否正确
你对session.gc_probability的理解完全正确。PHP会在每次session_start()被调用时,按照session.gc_probability / session.gc_divisor的概率计算是否触发会话垃圾回收,默认session.gc_divisor值为1000,设为1即代表每次请求有千分之一的概率启动GC。
是否是该配置导致session随机丢失
你遇到的问题大概率和这两个配置的调整直接相关,具体逻辑如下:
- 旧服务器
session.gc_probability设为0,相当于完全关闭PHP自带的会话垃圾回收能力,通常这类场景都是运维侧单独配置了定时脚本清理过期session,session过期逻辑完全由外部脚本控制,不会出现随机触发清理的情况。 - 新服务器开启了PHP自带的随机GC,同时
session.gc_maxlifetime从3600秒(1小时)下调到了1440秒(24分钟),每次GC触发时,所有超过24分钟未被访问的session文件都会被直接删除,这就会导致随机出现部分用户被强制登出、session数据全部丢失的问题,刚好命中GC触发时机、且session闲置超过24分钟的用户都会受到影响。
修复方案
- 如果要保持和旧服务器一致的运行逻辑,直接将新服务器的
session.gc_probability改回0即可,后续session清理可通过自定义定时脚本实现。 - 如果要保留PHP自带GC能力,可将
session.gc_maxlifetime调回3600或符合业务需求的更长时长;如果觉得千分之一的GC触发概率过高,也可以调整session.gc_probability和session.gc_divisor的比值,降低GC触发频率。
内容的提问来源于stack exchange,提问作者Vae
相关产品推荐
相关产品推荐

