【发布时间】:2012-02-20 16:57:08
【问题描述】:
我们在 apache 下运行的 php 应用程序偶尔会尝试锁定已删除的会话文件,这会挂起 apache 进程,最终我们会耗尽进程。
证据:
strace : flock(89, LOCK_EX -----stuck in flock for File Descriptor 89
然后:
lsof,对于同一个进程:
httpd 22161 apache 89u ... /var/lib/php/session/sess_mf7svvirg7rbu9l0m5999pm6h4 (deleted)
关于为什么会发生这种情况的任何想法?我们可以做些什么来预防它?
【问题讨论】:
-
a) 这个问题可能更适合webmasters.stackexchange.com b) 谁删除了会话文件?你还是 PHP?多久前被删了?您确定它已被删除,而不仅仅是被另一个进程锁定了吗?
-
你是使用php的会话管理还是自定义会话处理程序?
-
错误日志中有什么可能与为什么会发生这种情况有关吗?
-
php 的会话处理程序,错误日志中没有任何内容。文件被删除。网站管理员似乎主要关注谷歌分析。该文件不是手动删除的,但我可以查找流氓 cron。
-
我不知道为什么会发生这种情况,但标准的 Debian 防止方法已经很久了,不让 Apache/a 请求进行垃圾收集,而是设置机会 0 而是运行一个只检查文件时间戳的 cronscript。为了获得更多控制,您可以为这些会话文件定义一个自定义目录,以便可以再次设置超时并且不受其他正在运行的应用程序的阻碍。猜测原因:锁定文件的进程/请求是否也是试图重新打开文件的进程/请求,换句话说:具有相同会话 ID 的请求是否经常清理旧文件?
标签: php