我在使用 PHP 会话时遇到了问题,我不知道如何解决这个问题。
>> df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vglocal20120426-root00 36274176 32885458 3388718 91% /
tmpfs 6176642 1 6176641 1% /dev/shm
/dev/sda1 64000 47 63953 1% /boot
/dev/mapper/vglocal20120426-tmp00 131072 1703 129369 2% /tmp
和
>> df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vglocal20120426-root00 545G 248G 270G 48% /
tmpfs 24G 0 24G 0% /dev/shm
/dev/sda1 243M 31M 199M 14% /boot
/dev/mapper/vglocal20120426-tmp00 2.0G 802M 1.1G 42% /tmp
我有这个疯狂的数据
drwx-wx-wt 2 root root 1016389632 Jul 9 08:13 session
iNodes 已经达到 91%,并且每秒都在增长。问题是我的网站流量并不大(基于实时分析)。我不确定这里发生了什么。如何追溯问题并防止这种情况再次发生。
我们关闭了 PHP 垃圾收集器,而是每 8 小时使用 cronjob 删除旧会话一次。
现在技术支持正在运行一个脚本来删除会话文件,该脚本一直在运行,所以就像永无止境的过程。
如果有人能帮助我,我将不胜感激。谢谢
答案1
是的,你确实陷入了困境。问题是目录中有这么多文件,可能需要周删除所有文件。您暂时不需要 cronjob——它们可能只是堆积在一起,使目前的问题变得更糟。您还需要小心执行删除操作的具体方式——您不能尝试使用 glob 或以其他方式枚举所有文件,因为在您实际删除任何文件之前,这会花费很长时间并占用大量内存;相反,您需要一个脚本,它会在文件readdir
出现时删除它们(我怀疑,虽然我不确定,它find -delete
可能这样做;当我不得不删除几百万个文件时,我使用了一个小的 ruby 脚本)。
一旦问题得到控制(几周后),然后你可以每小时运行一次 cronjob 来删除几天/几周/任何时间之前的内容。我猜你已经年那里有相当多的会话文件。我也不知道该怎么做——根据我的经验,PHP 在控制这类事情方面做得还不错。