流行的浏览器中允许多少个并发AJAX(XmlHttpRequest)请求?

03/02 10:26
阅读数 385

在Firefox 3中,答案是每个域6个:触发到同一个域的第7个XmlHttpRequest(在任何选项卡上)后,就会排队,直到其他6个完成之一。

其他主要浏览器的数量是多少?

另外,是否有方法可以绕过这些限制而无需让我的用户修改其浏览器设置? 例如,对jsonp请求(使用脚本标记注入而不是XmlHttpRequest对象)的数量有限制吗?

背景:我的用户可以从网页向服务器发出XmlHttpRequest,要求服务器在远程主机上运行ssh命令。 如果远程主机关闭,则ssh命令需要几分钟的时间才能失败,最终使我的用户无法执行任何其他命令。


#1楼

我刚刚通过www.browserscope.org进行了检查,并使用IE9和Chrome 24进行了检查,您可以将6个并发连接到单个域,最多将17个并发连接到多个域。


#2楼

编写了我自己的测试。 测试了stackoverflow上的代码,效果很好,告诉我chrome / FF可以做到6

var change = 0;
var simultanius = 0;
var que = 20; // number of tests

Array(que).join(0).split(0).forEach(function(a,i){
    var xhr = new XMLHttpRequest;
    xhr.open("GET", "/?"+i); // cacheBust
    xhr.onreadystatechange = function() {
        if(xhr.readyState == 2){
            change++;
            simultanius = Math.max(simultanius, change);
        }
        if(xhr.readyState == 4){
            change--;
            que--;
            if(!que){
                console.log(simultanius);
            }
        }
    };
    xhr.send();
});

它适用于大多数可以在不同时间触发就绪状态更改事件的网站。 (又名:冲洗)

我在我的node.js服务器上注意到,我必须至少输出1025字节才能触发事件/刷新。 否则,事件将在请求完成时立即触发所有三个状态,所以这是我的后端:

var app = require('express')();

app.get("/", function(req,res) {
    res.write(Array(1025).join("a"));
    setTimeout(function() {
        res.end("a");
    },500);
});

app.listen(80);

更新资料

我注意到如果同时使用xhr和fetch api,您现在最多可以有2x个请求

var change = 0; var simultanius = 0; var que = 30; // number of tests Array(que).join(0).split(0).forEach(function(a,i){ fetch("/?b"+i).then(r => { change++; simultanius = Math.max(simultanius, change); return r.text() }).then(r => { change--; que--; if(!que){ console.log(simultanius); } }); }); Array(que).join(0).split(0).forEach(function(a,i){ var xhr = new XMLHttpRequest; xhr.open("GET", "/?a"+i); // cacheBust xhr.onreadystatechange = function() { if(xhr.readyState == 2){ change++; simultanius = Math.max(simultanius, change); } if(xhr.readyState == 4){ change--; que--; if(!que){ document.body.innerHTML = simultanius; } } }; xhr.send(); });


#3楼

Browserscope的网络结果将为您提供流行主机的每个主机名连接数最大连接数。 通过“野外”对用户运行测试来收集数据,因此它将保持最新状态。


#4楼

您可以用来增加并发连接数量的一个技巧是托管来自另一个子域的图像。 这些将被视为单独的请求,每个域都将限制为并发最大值。

IE6,IE7-不得超过两个。 如果您有宽带,则IE8为6-如果是宽带则为2。


#5楼

我相信浏览器将向同一域发出的并发http请求数量上限,根据用户的设置和浏览器,该请求的数量大约为4-8个。

您可以将请求设置为转到不同的域,这可能是可行的,也可能是不可行的。 雅虎人在这方面做了很多研究,您可以在此处阅读有关内容。 请记住,您添加的每个新域也都需要DNS查找。 YSlow的专家建议在2至4个域之间实现并行请求和DNS查找之间的良好折衷,尽管这主要是针对页面的加载时间,而不是后续的AJAX请求。

请问您为什么要提出这么多请求? 浏览器有充分的理由将请求数量限制到同一域。 如果可能,最好将请求捆绑在一起。

展开阅读全文
打赏
1
0 收藏
分享
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部