2

我有一个奇怪的问题,有时如果我快速连续地向我的 Apache 2.2 服务器发出两个 AJAX 请求,第二个请求将等待第一个请求完成后再完成。

例如,我有两个请求,一个休眠 10 秒,一个立即返回。如果我运行立即返回的请求,它将始终在 300 毫秒内返回。但是,如果我调用需要 10 秒的请求,然后在大约 50% 的时间内调用立即返回的请求,则第二个请求将等到第一个完成,并且 chrome 会在收到 10 秒前报告该请求太回复。另一半时间,快速请求将立即返回。

我找不到任何模式让它以一种或另一种方式运行,它有时会随机阻止快速 AJAX 请求,而其他时候它会按预期运行。我正在使用只有我正在访问的开发服务器,并且我已将 MaxRequestsPerChild 等几个变量设置为较高的值。

有谁知道为什么 Apache 看似随机地将我的 AJAX 请求转换为同步请求?

这是我正在运行的代码:

$.ajax({async:true,dataType:'json',url:'/progressTest',success:function(d){console.log('FINAL',d)}}); // Sleeps for 10 seconds
$.ajax({async:true,dataType:'json',url:'/progressTestStatus',success:function(d){console.log('STATUS',d)}}); // Takes ~300ms

这是两个屏幕截图。第一个按预期运行,第二个等待慢速进程首先完成(在示例中,超时设置为 3 秒)。

预期的异步行为

异步行为

更新:根据下面的评论 - 这似乎与 Chrome 一次只执行一个请求有关。任何想法为什么 Chrome 会对异步请求设置如此低的限制?

4

1 回答 1

1

问题不在于 Apache,而在于 Google Chrome 限制了对您的开发服务器的并发请求数。我只能猜测为什么它仅限于一个请求。这里有一对:

1)你有很多标签打开吗?并发连接的总数是有限制的,如果您有许多使用 KeepAlive 发出请求的选项卡,您可能处于该限制,并且只能建立一个与您的服务器的连接。如果是这种情况,您可以通过将 KeepAlive 添加到您自己的输出标头来解​​决此问题。

2)您是否启用了一些扩展。一些扩展对浏览器做了奇怪的事情。尝试禁用所有扩展并发出相同的请求。如果它有效,则一次启用它们以找到罪魁祸首扩展。

于 2012-06-06T23:41:26.253 回答