Windows XP 上的本地 Apache 未完成页面请求

Windows XP 上的本地 Apache 未完成页面请求

我在我的 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_statusmod_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)。

相关内容