在stream行的浏览器中允许多less个并发的AJAX(XmlHttpRequest)请求?

在Firefox 3中,每个域的答案是6个:一旦第七个XmlHttpRequest(在任何选项卡上)被激发,它就被排队,直到其他6个完成。

其他主stream浏览器的数字是多less?

另外,有没有我的用户修改他们的浏览器设置有办法解决这些限制? 例如,jsonp请求(使用脚本标记注入而不是XmlHttpRequest对象)的数量是否有限制?

背景:我的用户可以将XmlHttpRequests从一个网页发送到服务器,要求服务器在远程主机上运行ssh命令。 如果远程主机closures,那么ssh命令会花费几分钟的时间,最终会阻止我的用户执行任何进一步的命令。

你可以用来增加并发连接数的一个技巧是从不同的子域托pipe你的图像。 这些将被视为单独的请求,每个域将被限制为并发最大值。

IE6,IE7 – 有两个限制。 IE8是6,如果你有一个宽带 – 2(如果是拨号)。

Browserscope的networking结果将为您提供stream行浏览器的每个主机名最大连接数的连接 。 数据是通过对用户进行“野外”testing来收集的,因此它将保持最新。

使用IE6 / IE7,可以调整registry中并发请求的数量。 以下是如何将其设置为每个四个。

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings] "MaxConnectionsPerServer"=dword:00000004 "MaxConnectionsPer1_0Server"=dword:00000004 

根据IE 9 – 有什么变化? 在HttpWatch博客上,IE9在通过VPN时仍然有2个连接限制。

使用VPN Still Clobbers IE 9性能

我们之前报告过,当您的PC使用VPN连接时,IE 8中并发连接的最大数量缩减。 即使浏览器stream量没有经过该连接,也会发生这种情况。

不幸的是,IE 9受到VPN连接的影响同样如此:

我刚查过www.browserscope.org和IE9和Chrome 24,你可以有6个并发连接到单个域,最多17个到多个域。

我已经写了一个文件的AJAXtesting。 好好享受!!! 只是因为我的主机提供商有问题

 <?php /* Author: Luis Siquot Purpose: Check ajax performance and errors License: GPL site5: Please don't drop json requests (nor delay)!!!! */ $r = (int)$_GET['r']; $w = (int)$_GET['w']; if($r) { sleep($w); echo json_encode($_GET); die (); } //else ?><head> <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> <script type="text/javascript"> var _settimer; var _timer; var _waiting; $(function(){ clearTable(); $('#boton').bind('click', donow); }) function donow(){ var w; var estim = 0; _waiting = $('#total')[0].value * 1; clearTable(); for(var r=1;r<=_waiting;r++){ w = Math.floor(Math.random()*6)+2; estim += w; dodebug({r:r, w:w}); $.ajax({url: '<?php echo $_SERVER['SCRIPT_NAME']; ?>', data: {r:r, w:w}, dataType: 'json', // 'html', type: 'GET', success: function(CBdata, status) { CBdebug(CBdata); } }); } doStat(estim); timer(estim+10); } function doStat(what){ $('#stat').replaceWith( '<table border="0" id="stat"><tr><td>Request Time Sum=<th>'+what+ '<td>&nbsp;&nbsp;/2=<th>'+Math.ceil(what/2)+ '<td>&nbsp;&nbsp;/3=<th>'+Math.ceil(what/3)+ '<td>&nbsp;&nbsp;/4=<th>'+Math.ceil(what/4)+ '<td>&nbsp;&nbsp;/6=<th>'+Math.ceil(what/6)+ '<td>&nbsp;&nbsp;/8=<th>'+Math.ceil(what/8)+ '<td> &nbsp; (seconds)</table>' ); } function timer(what){ if(what) {_timer = 0; _settimer = what;} if(_waiting==0) { $('#showTimer')[0].innerHTML = 'completed in <b>' + _timer + ' seconds</b> (aprox)'; return ; } if(_timer<_settimer){ $('#showTimer')[0].innerHTML = _timer; setTimeout("timer()",1000); _timer++; return; } $('#showTimer')[0].innerHTML = '<b>don\'t wait any more!!!</b>'; } function CBdebug(what){ _waiting--; $('#req'+what.r)[0].innerHTML = 'x'; } function dodebug(what){ var tt = '<tr><td>' + what.r + '<td>' + what.w + '<td id=req' + what.r + '>&nbsp;' $('#debug').append(tt); } function clearTable(){ $('#debug').replaceWith('<table border="1" id="debug"><tr><td>Request #<td>Wait Time<td>Done</table>'); } </script> </head> <body> <center> <input type="button" value="start" id="boton"> <input type="text" value="80" id="total" size="2"> concurrent json requests <table id="stat"><tr><td>&nbsp;</table> Elapsed Time: <span id="showTimer"></span> <table id="debug"></table> </center> </body> 

编辑:
r表示排和等待时间。
当你最初按开始button80(或任何其他数量)的并发Ajax请求是由JavaScript启动,但众所周知,他们是由浏览器后台处理。 他们也被并行地请求到服务器(限制在一定数量,这是这个问题的事实)。 这里的请求在服务器端用随机延迟(由wbuild立)解决。 在开始时间,所有需要解决所有的ajax调用计算。 testing结束后,可以看到总计时间的一半,三分之一,四分之一等,扣除对服务器调用的并行性。 这不是严格的,也不是精确的,但是很高兴地看到实时看到ajaxs调用完成(看到传入的交叉)。 并且是一个非常简单的自包含脚本来显示ajax的基础知识。
当然,这个假设,服务器端没有引入任何额外的限制。
最好与萤火虫网板(或您的浏览器等效)

写了我自己的testing。 testing了stackoverflow上的代码,工作正常告诉我,铬/ 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(); }); 

它适用于大多数可以在不同时间触发readystate change事件的网站。 (又名:冲洗)

我注意到我的node.js服务器,我必须输出至less1025字节触发事件/刷新。 否则事件会在请求完成时一次触发全部三个状态,所以这里是我的后端:

 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,您现在可以拥有多达2个请求

 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(); }); 

我相信浏览器会对同一个域发出的最大并发http请求数量,根据用户的设置和浏览器,这个请求的数量是4-8个。

你可以设置你的请求去不同的域名,这可能是可行的也可能不可行。 雅虎们在这个领域做了大量的研究,你可以从这里了解到。 请记住,您添加的每个新域也需要DNS查找。 YSlow会推荐2到4个域名,以便在并行请求和DNS查询之间达成很好的折衷,尽pipe这是关注页面的加载时间,而不是后续的AJAX请求。

我可以问你为什么要提出这么多要求吗? 浏览器限制请求数量到同一个域有很好的理由。 如果可能的话,你会更好地捆绑请求。