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

流行浏览器中允许多少并发AJAX(XmlHttpRequest)请求?,ajax,browser,xmlhttprequest,Ajax,Browser,Xmlhttprequest,在Firefox3中,答案是每个域6个:只要对同一个域触发第7个XmlHttpRequest(在任何选项卡上),它就会排队,直到其他6个域中的一个完成 其他主要浏览器的数字是多少 还有,有没有办法绕过这些限制而不让我的用户修改他们的浏览器设置?例如,jsonp请求(使用脚本标记注入而不是XmlHttpRequest对象)的数量是否有限制 背景:我的用户可以从网页向服务器发出XmlHttpRequests,要求服务器在远程主机上运行ssh命令。如果远程主机关闭,ssh命令会在几分钟内失败,最终会阻

在Firefox3中,答案是每个域6个:只要对同一个域触发第7个XmlHttpRequest(在任何选项卡上),它就会排队,直到其他6个域中的一个完成

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

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


背景:我的用户可以从网页向服务器发出XmlHttpRequests,要求服务器在远程主机上运行ssh命令。如果远程主机关闭,ssh命令会在几分钟内失败,最终会阻止我的用户执行任何进一步的命令。

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


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

我相信浏览器会对同一个域发出最多并发http请求,这取决于用户的设置和浏览器,按4-8请求的顺序排列

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


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

使用IE6/IE7可以调整注册表中并发请求的数量。下面是如何将其设置为每个4

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

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

我编写了一个单文件AJAX tester。享受吧!!! 只是因为我和我的主机提供商有问题

<?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>
根据HttpWatch博客上的信息,IE9在通过VPN时仍然有2个连接限制

使用VPN仍然会影响IE 9的性能

我们之前报道过 关于最大值的缩小 IE中的并发连接数 8当您的电脑使用VPN连接时。 即使浏览器 交通没有经过那个 连接

不幸的是,IE9受到VPN的影响 连接方式相同:


我刚刚使用IE9和Chrome 24进行了检查,您可以有6个并发连接到单个域,最多17个并发连接到多个域。

编写了我自己的测试。在stackoverflow上测试代码,works fine告诉我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();
});
它适用于大多数可以在不同时间触发readystate更改事件的网站。(又名:冲洗)

我注意到在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,您现在可以有多达2倍的请求

var变化=0;
var simultanius=0;
var que=30;//测试次数
数组(que).join(0).split(0).forEach(函数(a,i){
获取(“/?b”+i)。然后(r=>{
改变++;
simultanius=Math.max(simultanius,变更);
返回r.text()
}).然后(r=>{
改变--;
";
如果(!que){
控制台日志(simultanius);
}
});
});
数组(que).join(0).split(0).forEach(函数(a,i){
var xhr=新的XMLHttpRequest;
xhr.open(“GET”,“a”+i);//cacheBust
xhr.onreadystatechange=函数(){
if(xhr.readyState==2){
改变++;
simultanius=Math.max(simultanius,变更);
}
if(xhr.readyState==4){
改变--;
";
如果(!que){
document.body.innerHTML=simultanius;
}
}
};
xhr.send();

});否,限制施加在域上。因此,从技术上讲,如果除了站点之外还有一个子域,您最多可以获得12个FF连接。因此,如果我了解您的情况,FF将所有请求(针对单个域)限制为6个,而不仅仅是XmlHttpRequests针对单个域。和其他浏览器做同样的事情有不同的限制。正确吗?哦,是的,如果你有一个包含一千张图片的页面,它会以六张一组的方式下载它们。我相信大多数其他主流浏览器的工作方式都是一样的。这是个好把戏。这也解释了为什么地图引擎的平铺服务器会创建一些伪子域(通常是像maps1.whater.com、maps2.whater.com、maps3.whater.com这样的子域)来加快速度。@请记住,浏览器始终保持其允许的最大并发ajax数量。如果您想了解您的情况,请尝试下面我的答案。通过ping远程软管查看其是否处于上升或下降状态的可行性是什么?这不会回答您的问题,但这可能是一个更好的工作流。谢谢Bob,这是我计划解决此问题的两种方法之一--我曾考虑在问题中提及此方法,但认为它与主题无关。(另一种方法是让我控制的服务器超时ssh请求。)我想你已经有了答案。。。假设Safari和Chrome至少支持2个,这是非常安全的,所以您可以随时使用它