【问题标题】:PHP sessions causing Apache to hang indefinitely导致 Apache 无限期挂起的 PHP 会话
【发布时间】:2011-02-11 21:51:36
【问题描述】:

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

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

经过进一步调查,Apache、PHP 或系统事件日志中没有错误。资源很丰富,没有“AJAX 垃圾风暴”或每页只有几个写入会话。我还尽可能实现了 session_write_close() 以尝试帮助提升问题。

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

会话本身仅包含 4 位信息。 ShoppingCartID、UserID、UserLevel 和 Referring URL,由字母数字组成,偶尔带有斜线。

我的 PHP.INI 的 session 部分是这样配置的:

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

我已经尝试了所有我能想到的方法,但现在整个问题对我来说都是模糊的。任何想法都将不胜感激,并感谢您花时间阅读本文:)

【问题讨论】:

  • 不需要删除会话文件。重新启动 apache 后,您实际上可以继续会话。
  • 我在安装 Apache/Linux 时遇到了完全相同的问题,您找到解决方案了吗?
  • 是的,我做了新安装,一切都很好>.>
  • @kmaid - 你必须重新安装什么来解决这个问题?阿帕奇? PHP?
  • 我无法弄清楚这个问题。我建议取消基于文件的会话,转而使用 memcached 或数据库。

标签: php windows apache session


【解决方案1】:

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

几乎想说它的锁文件。

【讨论】:

  • php 会话设置是默认设置,但 save_path 除外,这只是共享服务器上的安全风险,而这不是。
【解决方案2】:

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

否则,如果挂起是由会话文件被锁定引起的,我建议使用类似 SYSInternal 的 'Handle' 来获取哪些进程正在使用会话文件的列表问题。

【讨论】:

  • 不可能。有一些包含但不包含包含,并且设置了最大执行时间。我 99% 确定它的 apache 或 PHP 在您停止并启动 apache 服务后它会消失。无论如何,我会验证这一点。
  • 我也遇到过这个问题,Marc B。我没有找到解决办法,我使用的是 centos/unix。我刚刚更改了我的应用程序,使其不使用该部分的会话
  • 这也是我解决问题的方法。经过反思,可能值得尝试将 memcache 作为会话管理器
猜你喜欢
  • 1970-01-01
  • 2018-04-08
  • 2020-09-15
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 2011-05-11
  • 2021-09-14
  • 2017-06-29
相关资源
最近更新 更多