![尝试了解 Apache 超时/架构](https://linux22.com/image/608311/%E5%B0%9D%E8%AF%95%E4%BA%86%E8%A7%A3%20Apache%20%E8%B6%85%E6%97%B6%2F%E6%9E%B6%E6%9E%84.png)
我有一个运行 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 导致了此问题。