升级至PHP 7.4后会话1小时无活动即丢失问题求助
问题排查与解决方案
针对升级PHP 7.4后会话1小时失效的问题,结合Zend Framework 2和AWS EC2环境,按以下步骤排查:
1. 确认实际生效的PHP会话参数
php.ini配置可能被Apache虚拟主机、.htaccess或PHP-FPM池配置覆盖,先验证实际生效的参数:
创建一个PHP文件,写入以下代码并访问:
<?php var_dump([ 'session.gc_maxlifetime' => ini_get('session.gc_maxlifetime'), 'session.cookie_lifetime' => ini_get('session.cookie_lifetime'), 'session.save_path' => ini_get('session.save_path'), 'session.gc_probability' => ini_get('session.gc_probability'), 'session.gc_divisor' => ini_get('session.gc_divisor') ]); ?>
重点关注:
session.cookie_lifetime:若值为0(会话Cookie)或3600(1小时),会导致浏览器1小时后或关闭时丢失PHPSESSID,需改为864000(10天)。session.gc_maxlifetime:确认是否确实为864000,若不是则排查哪里覆盖了配置。
2. 检查Zend Framework 2的会话配置
ZF2的Zend\Session组件可能覆盖PHP默认配置,查看项目各模块的module.config.php,确认是否有会话相关配置:
'session' => [ 'config' => [ 'class' => 'Zend\Session\Config\SessionConfig', 'options' => [ 'gc_maxlifetime' => 864000, // 10天 'cookie_lifetime' => 864000, 'cookie_httponly' => true, // 可选,增强安全 ], ], 'storage' => 'Zend\Session\Storage\SessionArrayStorage', 'validators' => [ 'Zend\Session\Validator\RemoteAddr', 'Zend\Session\Validator\HttpUserAgent', ], ],
如果没有上述配置,添加后重启Apache,确保ZF2使用正确的会话有效期。
3. 排查AWS EC2的系统定时清理任务
若会话存储目录为/tmp(PHP默认路径),AWS EC2可能通过tmpwatch或systemd-tmpfiles定时清理临时文件:
- 检查定时任务:执行
crontab -l或查看/etc/cron.d/tmpwatch - 查看systemd tmpfiles配置:执行
cat /usr/lib/tmpfiles.d/tmp.conf
如果发现配置会在1小时内清理/tmp下的文件,需修改配置排除会话存储目录,或修改session.save_path到非临时目录(比如/var/lib/php/sessions),并确保PHP进程有读写权限。
4. 验证会话文件的生命周期
手动创建一个测试会话,访问应用后查看会话存储目录下的文件,记录其修改时间。等待1小时后再次检查:
- 如果文件被删除:说明GC触发时识别的过期时间不是10天,回到步骤1确认
gc_maxlifetime是否生效。 - 如果文件存在但浏览器仍需重新登录:说明浏览器Cookie已过期,回到步骤1检查
cookie_lifetime。
5. 排查会话存储权限
确保session.save_path指向的目录权限正确,Apache/PHP进程(通常是apache或www-data用户)拥有读写权限:
chown -R apache:apache /var/lib/php/sessions chmod 700 /var/lib/php/sessions
内容的提问来源于stack exchange,提问作者Gabriel Cunha
相关产品推荐
相关产品推荐

