Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
清理php会话文件_Php_Session - Fatal编程技术网

清理php会话文件

清理php会话文件,php,session,Php,Session,在我的网站上,我使用PHP会话。会话信息存储在my./Session路径中的文件中。几个月后,我发现这些会话文件从未被删除,到目前为止,这个目录中有145.000个 这些应该如何清理?我是否必须以编程方式进行清理,或者我是否可以在某个地方使用一个设置来自动进行清理 EDIT忘了提一下:这个站点运行在一个提供程序上,所以我没有访问命令行的权限。我确实有ftp访问权限,但会话文件属于另一个用户(我猜是Web服务器运行的用户),从我得到的第一个答案来看,我认为这不仅仅是服务器或PHP上的设置,所以我想

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

这些应该如何清理?我是否必须以编程方式进行清理,或者我是否可以在某个地方使用一个设置来自动进行清理


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

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

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
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

要正确处理会话,请查看

在这里,您可以找到以下变量:

  • session.gc_概率
  • session.gc_除数
  • session.gc_最大生存期
它们控制垃圾收集器(GC)在每个页面请求中运行的概率


您可以在脚本或.htaccess文件的开头设置这些文件,以便在某种程度上确定它们将在某个时候被删除。

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

开始将Cookie写入数据库,你就有很长的路要走,到时候可以跨多个服务器扩展你的应用程序


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

您可以创建脚本/etc/cron.hourly/php并将以下内容放在那里:

#!/bin/bash

max=24
tmpdir=/tmp

nice find ${tmpdir} -type f -name 'sess_*' -mmin +${max} -delete
然后使脚本可执行(chmod+x)


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

如果有人想使用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
命令

只要我每30分钟两分钱,而不是在时间上
# 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
#直接从“php-i”获取maxlifetime
#不管/var/lib/php5是否存在,错误转到/dev/null
09,39****find/var/lib/php5/-type f-cmin+$(echo“\`php-i| grep-i session.gc|u maxlife | 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_maxlifest
做数学题:|cut-d'-f3'/60'/bc)
RM匹配文件:-exec RM-f{}\

使用下面的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-执行rm{}

谢谢你的回答,正如我在问题的最新版本中所说,这不是从命令行运行它的选项,我将看看是否可以说服我的提供商在cron中放置类似的内容。谢谢你的回答Paul,正如我在问题的最新版本中所说,这不是从命令行运行它的选项,我会看看是否能说服我的提供商在cron中添加类似的内容。多亏了这一点,我发现一定有人将其剪切粘贴到了无效状态。命令中的&现在是&;。服务器已经两年多没有收集垃圾了。难怪这附近闻起来这么难闻!所以这完全绕过了通过ini_集合设置的任何内容?难怪在脚本中设置gc什么都不做。cron条目只清理/var/lib/php5中的会话文件。OP询问如何清理其自定义会话目录中的会话文件。因此,您需要创建一个脚本来遍历所有自定义目录,并执行与@paul dixon在这里为cron条目编写的相同的操作。我很好奇为什么Debian/Ubuntu会这样做?在我们的例子中,我们有一个自定义session.save_路径,因此cron.d脚本没有看到任何会话文件。我们建立了太多过时的会话文件,以至于inode用完了!谢天谢地,将session.gc_概率设置回1(Ubuntu默认设置为0)解决了这个问题。感谢Frankie,将其移动到数据库的好主意会记住这一点。注意:如果您使用子目录选项存储会话文件(请参阅上面的session.save_路径),然后垃圾收集不会自动发生。您将需要通过shell脚本、cron条目或其他方法进行自己的垃圾收集。例如,以下脚本相当于将session.gc_maxlifetime设置为1440(1440秒=24分钟):cd/path/to/sessions;查找-cmin+24 | xargsrm@Jehy看起来,即使您有一个自定义会话。save_path,PHP现在也可以执行垃圾收集。@DarrellBrogdon使用自定义会话。save path时,您有关于PHP自动垃圾收集的资源或更多信息吗?“如果是这样的话,那就太好了。”马丁·梅尔斯说