You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 16.04.1 LTS下PHP 7会话无法被垃圾回收清除的问题排查

碰到过不少Debian/Ubuntu系统上PHP会话垃圾回收失效的情况,结合你描述的场景,咱们来拆解问题原因和对应的解决办法:

故障原因分析
  • Cron任务触发条件不兼容systemd:Ubuntu 16.04已经改用systemd,但/etc/cron.d/php里的默认任务带有if [ ! -d /run/systemd/system ]; then ...的判断——这个条件在systemd系统下永远为假,导致定时任务根本没执行。这是很多人踩过的坑。
  • sessionclean脚本读取了错误的php.ini配置:Debian系的sessionclean默认读取PHP CLI的配置文件(/etc/php/7.2/cli/php.ini),但你修改的是Apache的php.ini(/etc/php/7.2/apache2/php.ini)。如果两个配置里的session.gc_maxlifetime不一致,脚本会用CLI的过期时间判断,导致本该清理的文件被当成未过期。
  • 会话目录或文件权限异常:虽然Debian默认给/var/lib/php/sessions/设置了严格权限(1733,粘性位),但如果目录权限被篡改,或者某些会话文件的权限过于苛刻(比如000),即使root运行脚本也无法删除文件。
  • sessionclean脚本本身损坏或权限不足:脚本可能被误修改、删除,或者权限被改成不可执行,导致cron调用时直接失败。
解决建议

1. 修复Cron任务的systemd兼容问题

编辑/etc/cron.d/php文件,把里面的定时任务行修改为:

09,39 * * * * root [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean

去掉那个if [ ! -d /run/systemd/system ]; then的判断,确保在systemd系统下也能正常执行。修改后重启cron服务:

sudo systemctl restart cron

2. 确保sessionclean读取正确的gc_maxlifetime

手动验证脚本读取的过期时间是否和你设置的一致:

# 读取Apache配置里的gc_maxlifetime
php -c /etc/php/7.2/apache2/php.ini -r 'echo ini_get("session.gc_maxlifetime")."\n";'
# 读取sessionclean脚本实际使用的gc_maxlifetime
/usr/lib/php/sessionclean --dry-run

如果两者不一致,编辑/usr/lib/php/sessionclean脚本,找到读取gc_maxlifetime的部分,替换为读取Apache的配置文件。比如把原来的php -r 'echo ini_get("session.gc_maxlifetime");'改成:

php -c /etc/php/7.2/apache2/php.ini -r 'echo ini_get("session.gc_maxlifetime");'

3. 修复会话目录及文件权限

先检查目录权限:

ls -ld /var/lib/php/sessions/

正确的权限应该是drwx-wx-wt 2 root root(权限值1733)。如果不对,执行:

sudo chmod 1733 /var/lib/php/sessions/
sudo chown root:root /var/lib/php/sessions/

如果有个别文件权限异常导致无法删除,可以手动强制清理:

sudo find /var/lib/php/sessions/ -type f -mmin +$(php -c /etc/php/7.2/apache2/php.ini -r 'echo ini_get("session.gc_maxlifetime")/60;') -delete

4. 验证sessionclean脚本的可用性

先手动执行脚本,看是否有报错:

sudo /usr/lib/php/sessionclean

如果执行失败,检查脚本权限:

ls -l /usr/lib/php/sessionclean

确保权限是-rwxr-xr-x 1 root root(755),如果不是,执行:

sudo chmod 755 /usr/lib/php/sessionclean

如果脚本损坏,可以重新安装php-common包恢复:

sudo apt-get install --reinstall php-common

内容的提问来源于stack exchange,提问作者zero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:36:58