清除 php 会话文件

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

这些应该怎么清理?我必须以编程的方式进行清理吗? 或者是否有一种设置可以让这种清理自动进行?

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

141292 次浏览

使用带有 find 的 cron 删除超过给定阈值的文件。 例如,删除至少一周内未被访问的文件。

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

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

Maxlife 脚本只是通过检查 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

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

你会发现这些变量:

  • 可能性
  • 除数
  • Session.gc _ maxlifetime

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

您可以在脚本的开头用 Ini _ set ()设置它们,或者。Htaccess 文件,这样你就可以确定在某种程度上他们将被删除的某个时候。

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

开始将 Cookie 写入数据库,到时候你就可以跨多个服务器扩展你的应用程序了。

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

您可以创建 script/etc/cron.hour/php 并将其放在:

#!/bin/bash


max=24
tmpdir=/tmp


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

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

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

如果有人想这么做,请记住:

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

非常缓慢,当有很多文件。

考虑使用以下代码:

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

如果文件名中有空格,请使用以下命令:

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

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

只有我的意见

# 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

分类: 只有文件: < strong > find/var/lib/php5/-type f
超过分钟: Cmin
获取 php 设置: < strong > $(echo”‘ php-i | grep-i session.gc _ maxlife
算算看: | cut-d’’-f3’/60”| bc)
RM 匹配文件: 执行 rm-f {} ; < br >

使用以下 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

Cd 到会话目录,然后:

1)观看时长超过40分钟的节目: find . -amin +40 -exec stat -c "%n %y" {} \;

2)取消超过40分钟的课程: find . -amin +40 -exec rm {} \;