Apache太多打开的文件(24)

时间:2015-09-04 11:22:28

标签: php linux apache session

由于这个问题有很多答案,而且打开文件太多(24)"以及如何解决它只是增加允许打开文件的数量限制我还没有找到任何建议如何检查谁在使用这些文件。

我收到此错误:

  

致命错误:未捕获的异常'异常'消息'未知:打开(/ var / lib / php / session / sess_375048d5pfne5cu3v0l3sjji04,O_RDWR)失败:打开的文件太多(24)'在

我也重启了我的apache进程:

$ ps aux | grep apa
84:root      7528  0.0  0.1 102376  4908 ?        Ss   11:11   0:00 /usr/sbin/apache2 -k start
85:www-data  7531  0.0  0.0 101528  2952 ?        S    11:11   0:00 /usr/sbin/apache2 -k start
86:www-data  7532  0.0  0.1 1309308 7168 ?        Sl   11:11   0:00 /usr/sbin/apache2 -k start
87:www-data  7533  0.0  0.1 1309308 7312 ?        Sl   11:11   0:00 /usr/sbin/apache2 -k start
91:vagrant   7748  0.0  0.0   8860   648 pts/0    S+   11:20   0:00 grep --color=auto -in apa

是否有任何工具可以检查谁使用这些文件,因为我的虚拟机器实际上正在htop睡觉?

1 个答案:

答案 0 :(得分:3)

查看目录/var/lib/php!你会发现许多以sess_开头的文件。这些文件包含访问者的会话数据。

如何查看谁在使用这些文件:

lsof -n|grep -F /var/lib/php/sess_

将为您提供一个进程列表,进程正在使用它们。

如果删除这些文件(rm -vf /var/lib/php/sess_*),您当前的所有访问者都将失去当前会话(他们需要重新登录您的网站),但问题将会得到解决。

长期解决方案是更频繁地使您的会话失效。在this question中你可以找到,如何在你的php中设置自动删除过期的会话文件。在我看来,将session.cookie_lifetime设置为大约半小时,session.gc_maxlifetime设置一点点(f.e。35分钟)就可以了。

如果您只有一个访问者少的网站(每天最多几十个),那么如果您每天从crontab中删除旧的会话文件就足够了。

如果您有一个大型网站,或者您想要一个超级用户友好(但不那么安全)的网站,您需要能够处理批次的会话。在我看来,在这种情况下,最好使用一些备用的php会话解决方案和数据库后端。

命令find /var/lib/php -type f -name "sess_*" \! -ctime 1440|xargs -P 1 -n 50 rm -vf将删除此目录中以sess_开头的所有文件,以及更早的日期。