我在我的 Windows XP (SP3) 开发机器上本地安装了 Apache 2.2.11,大约 3 个月前设置的。
我最近几周刚刚开始遇到一个奇怪的问题。
Apache 正在为一些基本的 PHP 应用程序提供服务,例如 phpMyAdmin。当我发出页面请求时,Apache 似乎没有完成为该页面提供所有资源。Firefox 显示“正在从服务器名称传输数据...”消息,并且页面从未完成。Internet Explorer 中也发生了同样的问题。
我有时可以知道它正在等待哪种资源,因为除了一些图像或类似资源外,大部分页面都会呈现。(不确定为什么 Firebug 不显示这个)
并不是每次页面请求都会出现问题 - 对于大多数资源都缓存在我的浏览器中的页面请求,页面请求将毫无问题地运行。或者非常轻量的页面也将毫无问题地运行。
但是,如果我“硬”刷新页面,就会遇到这个问题(可能是因为它正在请求所有页面资源)
有人知道这是啥吗?
这太奇怪了,它才刚刚开始发生 - 而且我没有对我的系统进行任何更改(我知道)
我尝试使用 ApacheThreadsPerChild
设置,但似乎没有什么变化。
更新:
我做了一些其他测试。我提供的是最基本的页面,只是一个普通的 HTML 文件:
<html>
<body>
<h1>testing</h1>
</body>
</html>
如果我连续多次请求此页面,并且每个请求都在前一个请求完成后立即发生,则 50% 的时间请求将超时。
但是,如果我在请求之间设置 1-2 秒的间隔,那么就没有问题。
这与我在浏览器请求真实应用程序页面时观察到的情况相关。当浏览器没有缓存任何内容时,所有页面资源都会在很短的时间内从浏览器请求 - 这似乎会引发问题。
更新2:
Nathan Long 通过服务器状态页面(见下文)帮助我更好地理解了这个问题。
这很奇怪,就好像服务器在向客户端发送数据时出现了问题。客户端一直在那里等待数据,但数据却永远不会到达。关闭客户端进程不会终止服务器上的连接 - 对于每个之前尝试的连接,服务器仍然有活动线程,但它们只是在那里 - 不发送任何数据,也永远不会终止。(即使客户端现在已关闭)只有重新启动服务器才能终止它们。
答案1
更新-已修复!
Apache 邮件列表的 William Rowe 给了我答案,这显然是众所周知的事情。
XP [个人操作系统] 仅支持同时使用两个 TransmitFile API 应用程序。请在您的配置中尝试“EnableSendfile Off”这一“常规答案”。
随着这一改变,这个问题对我来说已经消失了。
原始答案
遇到同样的问题 - 在 Windows XP 上使用 Apache 2.2.14。我不得不使用稍长(但仍然非常基本)的静态 HTML 文件来解决加载问题,但确实发生了。
我刚刚启用了 localhost/server-status 页面conf/extra/httpd-info.conf
(您还必须在主配置文件中启用几个模块),然后我注意到每次发生加载问题时,处理的请求数量就会增加 1,空闲工人的数量也随之下降。即使“无限加载”出现在服务器状态页面本身,情况也是如此 - 我点击刷新,它立即成功加载,并处理了另一个请求。
每个正在处理的请求都显示“发送回复”状态。
ExtendedStatus
我也在中打开了httpd.conf
,现在我可以看到正在处理的每个请求的详细信息。许多请求已经进行了几分钟,其中许多请求自开始以来已传输了 0.0 千字节。
我不知道该如何理解这一点。
server-status 的详细说明
http://your.server.name/server-status
您可以通过执行以下操作来使服务器状态页面可用:
1)启用mod_status
并mod_info
(获取更多信息)httpd.conf
2)还添加Include conf/extra/httpd-info.conf
,或者添加以下指令(包含的内容httpd-info.conf
):
# Turn on server status
<Location /server-status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from localhost
</Location>
# Enable more status info
ExtendedStatus On
3)重新启动Apache并加载状态页面。
答案2
检查您的 Apache 错误日志,您是否看到类似“子进程用完,请尝试增加最大服务器数”的内容?如果看到,则说明您遇到了机器打开连接过多的问题。
您还可以检查您的 PHP 以查看它是否有任何长时间运行的进程,如果有,您可能需要增加 PHP.ini 中的 script_timeout 值。
还要确保您的 PHP 正在记录错误,并确保脚本本身没有因错误而退出。
您可以创建一个包含该页面静态内容版本的简单 test.html,并查看它是否能重复正确加载,如果能,那么它就不是 Apache(persay)。