清理php会话文件

时间:2009-03-17 13:43:34

标签: php session

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

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

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

9 个答案:

答案 0 :(得分:54)

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

你会发现这些变量:

  • session.gc_probability合
  • session.gc_divisor
  • 的session.gc_maxlifetime

这些控制垃圾收集器(GC)运行每个页面请求的概率。

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

答案 1 :(得分:35)

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

答案 2 :(得分:21)

如果有人想要用cronjob做这件事,请记住这一点:

find .session/ -atime +7  -exec rm {} \;

在拥有大量文件时非常慢。

请考虑改用:

find .session/ -atime +7 | xargs -r rm

如果你的文件名中有空格,请使用:

find .session/ -atime +7 -print0 | xargs -0 -r rm

xargs将使用要删除的文件填充命令行,然后运行rm命令比-exec rm {} \;小很多,这将为每个命令调用rm命令文件。

只是我的两分钱

答案 3 :(得分:5)

使用cron with find删除早于给定阈值的文件。 例如,删除至少一周未访问过的文件。

find .session/ -atime +7  -exec rm {} \;

答案 4 :(得分:5)

你可以创建脚本/etc/cron.hourly/php并放在那里:

#!/bin/bash

max=24
tmpdir=/tmp

nice find ${tmpdir} -type f -name 'sess_*' -mmin +${max} -delete

然后使脚本可执行(chmod + x)。

现在,每隔一小时将删除超过24分钟前修改过数据的所有会话文件。

答案 5 :(得分:3)

# Every 30 minutes, not on the hour<br>
# Grabs maxlifetime directly from \`php -i\`<br>
# doesn't care if /var/lib/php5 exists, errs go to /dev/null<br>

09,39 * * * *   find /var/lib/php5/ -type f -cmin +$(echo "\`php -i|grep -i session.gc_maxlifetime|cut -d' ' -f3\` / 60" | bc) -exec rm -f {} \\; >/dev/null 2>&1

细分: 只有文件:查找/ var / lib / php5 / -type f
超过分钟: -cmin
获取php设置: $(echo“`php -i | grep -i session.gc_maxlifetime
算一算: | cut -d'' - f3` / 60“| bc)
RM匹配文件: -exec rm -f {} \;

答案 6 :(得分:2)

我最好的猜测是你在共享服务器上并且会话文件与所有用户混合在一起,所以你不能,也不应该删除它们。如果您担心扩展和/或用户会话隐私,您可以做的是将会话移动到数据库。

开始将Cookie写入数据库,并且在时间到期时,您可以在多个服务器上扩展应用程序。

除此之外,我不会担心145.000文件。

答案 7 :(得分:2)

cd到sessions目录,然后:

1)查看超过40分钟的会话:  find . -amin +40 -exec stat -c "%n %y" {} \;

2)删除超过40分钟的会话: find . -amin +40 -exec rm {} \;

答案 8 :(得分:0)

使用下面的cron:

39 20     * * *     root   [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 | xargs -r -0 rm