在我的网站上,我使用PHP会话.会话信息存储在我的./session路径中的文件中.几个月后,我发现这些会话文件永远不会被删除,现在这个目录中有145.000个.
应该如何清理?我是否必须以编程方式执行此操作,或者是否可以使用某个可以自动执行此清理的设置?
编辑忘记提及:此站点在提供程序上运行,因此我无法访问命令行.我确实有ftp-access,但是会话文件属于另一个用户(我猜的是webserver进程运行的那个)从我得到的第一个答案我认为它不仅仅是服务器或PHP上的设置,所以我想我会必须在PHP中为它实现一些东西,并定期从浏览器调用它(可能来自在我家自己的机器上运行的cron作业)
要正确处理会话,请查看http://php.net/manual/en/session.configuration.php.
在那里你会发现这些变量:
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 {} \;
的rm
命令,这将调用每个文件的命令.
只是我的两分钱
使用cron with find删除早于给定阈值的文件.例如,删除至少一周未访问过的文件.
find .session/ -atime +7 -exec rm {} \;
你可以创建脚本/etc/cron.hourly/php并放在那里:
#!/bin/bash max=24 tmpdir=/tmp nice find ${tmpdir} -type f -name 'sess_*' -mmin +${max} -delete
然后使脚本可执行(chmod + x).
现在,每隔一小时将删除所有会话文件,其中包含超过24分钟前修改过的数据.