清理php会话文件

Jac*_*ack 60 php session

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

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

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

Seb*_*Seb 56

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

在那里你会发现这些变量:

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

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

您可以在脚本开头或.htaccess文件中使用ini_set()进行设置,以便在某种程度上确定它们会在某个时间被删除.

  • 注意:如果您使用子目录选项存储会话文件(请参阅上面的session.save_path),则垃圾收集不会*自动发生.您需要通过shell脚本,cron条目或其他方法进行自己的垃圾收集.例如,以下脚本相当于将session.gc_maxlifetime设置为1440(1440秒= 24分钟):cd/path/to/sessions; 找-cmin +24 | xargs rm (8认同)
  • @Jehy 即使您有自定义 session.save_path,PHP 现在也可以执行垃圾收集。 (2认同)

Pau*_*xon 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • cron条目只清理/ var/lib/php5中的会话文件.OP询问有关在其自定义会话目录中清理会话文件的问题.因此,您需要创建一个遍历所有自定义目录的脚本,并且与@ paul-dixon在此处为cron条目编写的内容相同. (4认同)

小智 23

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

find .session/ -atime +7  -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)

当有很多文件时,真的很慢.

考虑使用此代替:

find .session/ -atime +7 | xargs -r rm
Run Code Online (Sandbox Code Playgroud)

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

find .session/ -atime +7 -print0 | xargs -0 -r rm
Run Code Online (Sandbox Code Playgroud)

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

只是我的两分钱

  • 另请记住,您可以使用 `-exec $cmd {} +;` 而不是 `-exec $cmd {} \;` 它将执行在一个命令中找到的所有文件,而不是为每个命令运行一次找到文件。这与 `Andi` 推荐的 xargs 非常相似。在此处阅读更多相关信息:https://unix.stackexchange.com/questions/195939/what-is-meaning-of-in-finds-exec-command (4认同)

Dav*_*kon 6

cd 到会话目录,然后:

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

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

  • 谢谢,这很有帮助。我将“第 2 步”与 Andi 的代码结合起来,这对我来说更快(我当时是 100%):`find . -阿明 +40 | xargs -r rm` (2认同)

var*_*tec 5

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

find .session/ -atime +7  -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)


Dan*_*lde 5

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

#!/bin/bash

max=24
tmpdir=/tmp

nice find ${tmpdir} -type f -name 'sess_*' -mmin +${max} -delete
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

# 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
Run Code Online (Sandbox Code Playgroud)

细分:仅文件: find /var/lib/php5/ -type f
早于分钟: -cmin
获取 php 设置: $(echo "`php -i|grep -i session.gc_maxlifetime
计算一下: |cut -d ' ' -f3` / 60" | bc)
RM 匹配文件: -exec rm -f {} \;