PHP会话导致Apache无限期挂起

时间:2010-04-24 16:31:27

标签: php windows apache session

问题在于,每隔一段时间写入一个会话的页面就会导致apache永久挂起以用于特定会话。一旦用户发生此错误,任何用户的任何会话的任何进一步修改都将导致该网站为该用户挂起。

这个问题一直是我关注的焦点。我有一个运行Windows 2003的开发VPS和使用标准PHP会话处理程序的默认最新版本的XAMPP。有问题的代码实际上通常在其他两台机器上运行,所以虽然我的常识说这是一个Web服务器配置问题,但此时我愿意尝试任何事情。

在进一步调查中,Apache,PHP或系统事件日志中没有错误。资源非常丰富,并且没有“AJAX狗屎风暴”或者每页都有一对写入会话。我还尽可能地实现了session_write_close(),以帮助提升问题。

我已经检查了设置为“C:\ windows \ Temp”的会话目录,发现一旦用户进入此挂起阶段,相应的会话文件将被独占锁定,解决此问题的唯一方法就是停止Apache等一会儿文件解锁并删除它们。我不想知道是否需要删除。

会话本身只包含4位信息。 ShoppingCartID,UserID,UserLevel和Refering URL是偶数斜线的字母数字。

我的PHP.INI会话部分配置如下:

session.save_handler = files
session.save_path = "C:\WINDOWS\Temp"
session.use_cookies = 1
session.name = PHPSESSID
session.auto_start = 0
session.cookie_lifetime = 0
session.cookie_path = /
session.cookie_domain =
session.cookie_httponly =
session.serialize_handler = php
session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 1440
session.bug_compat_42 = 1
session.bug_compat_warn = 1
session.referer_check =
session.entropy_length = 0
session.entropy_file =
session.cache_limiter = nocache
session.cache_expire = 180
session.use_trans_sid = 0
session.hash_function = 0
session.hash_bits_per_character = 4

我已经尝试了所有我能想到的东西,整个问题现在对我来说很模糊。任何想法将不胜感激,感谢您的时间阅读:)

2 个答案:

答案 0 :(得分:1)

可能是您的会话文件被Windows锁定或某些php.ini设置未正确完成。请SEE HERE

几乎想说出它的锁文件。

答案 1 :(得分:0)

您的应用内部是否可以在内部再次从同一网站请求网页?你可能会遇到一种竞争条件,其中页面A激活,锁定会话,然后以某种方式触发对自身的请求,或者页面B,它也尝试重新启动会话,现在已被锁定,并且请求挂起。

否则,如果会话文件被锁定导致挂起 ,我建议使用SYSInternal的“Handle”之类的内容来获取正在使用会话的进程列表有问题的文件。