清理php会话文件
在我的网站上,我使用PHP会话。 会话信息存储在我的./sessionpath的文件中。 几个月后,我发现这些会话文件永远不会被删除,现在在这个目录中有145.000个。
这些应该如何清理? 我是否必须以编程方式执行此操作,或者我可以在某处使用会自动执行此清理的设置吗?
编辑忘了提及:这个网站运行在一个提供商,所以我没有访问命令行。 我有FTP访问,但会话文件属于另一个用户(一个Web服务器进程运行我猜)从我得到的第一个答案我认为这不只是在服务器或PHP的设置,所以我想我会必须在PHP中实现一些东西,并定期从浏览器中调用它(也许是从我自己的机器上运行的cron作业)
要正确处理会话,请查看http://php.net/manual/en/session.configuration.php 。
你会发现这些variables:
- session.gc_probability合
- session.gc_divisor
- 的session.gc_maxlifetime
这些控制垃圾收集器(GC)与每个页面请求运行的概率。
您可以在脚本或.htaccess文件的开始处设置ini_set() ,以便在某种程度上确定它们将在某个时间被删除。
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
如果有人想用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 {} \;
小得多-exec rm {} \;
,它将为每个文件调用rm
命令。
只是我的两分钱
使用cron和find来删除比给定阈值更早的文件。 例如删除至less一周内没有被访问的文件。
find .session/ -atime +7 -exec rm {} \;
你可以创build脚本/etc/cron.hourly/php并放在那里:
#!/bin/bash max=24 tmpdir=/tmp nice find ${tmpdir} -type f -name 'sess_*' -mmin +${max} -delete
然后使脚本可执行(chmod + x)。
现在每隔一小时将会删除所有会话文件,其数据修改时间超过24分钟。
# 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
分解:只有文件: find / var / lib / php5 / -type f
比分钟早 : -cmin
获取php设置: $(echo“`php -i | grep -i session.gc_maxlifetime
做math运算: | cut -d''-f3` / 60“| bc)
RM匹配文件: -exec rm -f {} \;
我最好的猜测是你在一个共享服务器上,会话文件是混合在所有的用户,所以你不能,也不应该删除它们。 如果您担心扩展和/或您的用户会话隐私,您可以做什么,是将会话移动到数据库。
开始将该Cookie写入数据库,在时间到期之前,您可以跨多个服务器扩展应用程序。
除此之外,我不用担心145.000文件。
使用下面的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" {} \;
find . -amin +40 -exec stat -c "%n %y" {} \;
2)删除超过40分钟的会话: find . -amin +40 -exec rm {} \;
find . -amin +40 -exec rm {} \;