尝试了解 Apache 超时/架构

尝试了解 Apache 超时/架构

我有一个运行 Apache httpd 2.2.15 和 PHP 5.3.3 的 CentOS 版本 6.3 系统。

我的 PHP 网站运行良好,除了一个查询,该查询显然已达到超时限制。该查询现在运行时间超过 60 秒,因此,用户的浏览器只能等待 - 等待时间更长,大约 5 分钟或更长时间 - 然后显示空白页。

这让我很好奇 Apache/PHP 究竟是如何工作的。

我建立了一个简单的 PHP 脚本测试用例,它只执行以下操作:

  • 睡眠55/65秒;
  • 将“我还在这里!”附加到服务器上的文件中;
  • 输出一行 HTML。

当超时时间为 55 秒时,一切都按预期工作;我的浏览器旋转等待 55 秒,然后呈现 HTML。

当我将超时设置为 65 秒时,浏览器会旋转 5 分钟或更长时间,然后才显示一个完全空白的页面。同时:

  • “我仍然在这里”调试行仍然附加到服务器上的文件中,表明 PHP 正常运行;

  • Apache 访问日志还显示查询已运行,​​返回 HTTP 状态代码 200 和组成 HTML 的正确字节数;

  • Apache 或 PHP 均未记录任何错误。

我尝试更改一些看似相关的配置设置:

  • Apache httpd.conf 的“Timeout”指令,从 60 到 120;

  • php.ini 的“default_socket_timeout”设置,从 60 到 120。

但测试用例仍然运行得一模一样;即使页面在 65 秒后返回,浏览器仍然“挂起”。Firefox 的多个版本都有这种情况。

有人能帮助我了解这里的工作原理吗?其次,我如何增加有效超时限制,以便我的慢速查询可以运行超过 60 秒并成功将其结果返回到浏览器?

我原本以为,如果 Apache 中有一个限制 - “不要等待 PHP 运行查询超过 60 秒” - 那么它要么在 60 秒过去后向浏览器返回某种错误,要么记录其他错误。相反,我看到 PHP 运行完成,Apache 访问日志告诉我“嘿,一切顺利,我将 75 个字节的输出传输到浏览器”,但浏览器本身只是停留在那里,从未收到该输出。什么被默默地“断开连接”了?如果 Apache 从不发送错误,并允许 PHP 运行完成,为什么它不将结果发回(就像它在访问日志中所说的那样)?

非常感谢您的帮助。

答案1

将 /etc/php.ini 中的所有 60 秒值更新为 120 以进行测试。如果您在配置更改后重新启动 Apache,并且仍然遇到所述问题,那么根据描述,似乎是 php 导致了此问题。

相关内容