清理 php 会话文件

2022-08-30 08:47:00

在我的网站上,我使用PHP会话。会话信息存储在我的 ./session 路径中的文件中。几个月后,我发现这些会话文件从未被删除,到目前为止,此目录中有145.000个会话文件。

应该如何清理这些?我是否必须以编程方式执行此操作,或者是否可以在某个地方使用该设置,以便自动进行此清理?

编辑忘了提:这个网站在提供商处运行,所以我无法访问命令行。我确实有ftp访问权限,但会话文件属于另一个用户(我猜是Web服务器进程运行的那个)从我得到的第一个答案来看,我认为它不仅仅是服务器或PHP上的设置,所以我想我必须在PHP中实现一些东西,并定期从浏览器调用它(也许来自我家中自己的机器上运行的cron作业)


答案 1

要正确处理会话,请查看 http://php.net/manual/en/session.configuration.php

在那里,您将找到以下变量:

  • session.gc_probability
  • session.gc_divisor
  • session.gc_maxlifetime

它们控制每个页面请求一起运行的垃圾回收器 (GC) 概率。

您可以在脚本或.htaccess文件的开头设置带有ini_set()的那些,这样您就可以确定它们在某种程度上会被删除。


答案 2

Debian/Ubuntu 使用 /etc/cron.d/php5 中定义的 cronjob 来处理这个问题

# /etc/cron.d/php5: crontab fragment for php5
#  This purges session files older than X, where X is defined in seconds
#  as the largest value of session.gc_maxlifetime from all your php.ini
#  files, or 24 minutes if not defined.  See /usr/lib/php5/maxlifetime

# Look for and purge old sessions every 30 minutes
09,39 *     * * *     root   [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm

maxlifetime 脚本只是通过检查 php.ini返回会话应保持活动的分钟数,如下所示

#!/bin/sh -e

max=1440

for ini in /etc/php5/*/php.ini; do
        cur=$(sed -n -e 's/^[[:space:]]*session.gc_maxlifetime[[:space:]]*=[[:space:]]*\([0-9]\+\).*$/\1/p' $ini 2>/dev/null || true);
        [ -z "$cur" ] && cur=0
        [ "$cur" -gt "$max" ] && max=$cur
done

echo $(($max/60))

exit 0

推荐