Combien de requêtes AJAX (XmlHttpRequest) simultanées sont autorisées dans les navigateurs populaires?

dans Firefox 3, la réponse est 6 par domaine: dès qu'une 7ème XmlHttpRequest (sur n'importe quel onglet) du même domaine est lancée, elle est mise en file d'attente jusqu'à ce que l'un des 6 autres termine.

Quels sont les chiffres pour les autres navigateurs?

aussi, y a-t-il des moyens de contourner ces limites sans que mes utilisateurs modifient les paramètres de leur navigateur? Par exemple, y a-t-il des limites au nombre de requêtes jsonp (qui utilisent l'injection d'une balise script plutôt qu'une Objet XmlHttpRequest)?

Background: mes utilisateurs peuvent faire des XmlHttpRequests depuis une page web vers le serveur, demandant au serveur d'exécuter des commandes ssh sur des hôtes distants. Si les hôtes distants sont désactivés, la commande ssh prend quelques minutes pour échouer, empêchant éventuellement mes utilisateurs d'exécuter d'autres commandes.

340
demandé sur Will 2009-02-18 16:28:15

8 réponses

un truc que vous pouvez utiliser pour augmenter le nombre de connexions simultanées est d'héberger vos images à partir d'un sous-domaine différent. Ces requêtes seront traitées comme des requêtes distinctes, chaque domaine étant limité au maximum simultané.

IE6, IE7-ont une limite de deux. IE8 est 6 Si vous avez une large bande-2 (si c'est un accès commuté).

137
répondu Bob 2016-10-07 20:07:00

les résultats du réseau à Browserscope vous donnera à la fois connexions par nom D'hôte et connexions Max pour les navigateurs populaires. Les données sont recueillies en faisant des tests sur les utilisateurs "dans la nature", de sorte qu'il restera à jour.

101
répondu Kevin Hakanson 2010-08-30 03:27:17

avec IE6 / IE7 on peut modifier le nombre de requêtes concurrentes dans le registre. Voici comment mettre à quatre chacun.

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000004
"MaxConnectionsPer1_0Server"=dword:00000004
24
répondu brianegge 2009-03-23 02:36:31

je viens de vérifier avec www.browserscope.org et avec IE9 et Chrome 24 Vous pouvez avoir 6 connexions simultanées à un seul domaine, et jusqu'à 17 à plusieurs.

7
répondu xmorera 2013-07-03 13:06:57

selon IE 9-Qu'est-ce qui a changé? sur le blog HttpWatch, IE9 a toujours une limite de connexion de 2 lorsque vous utilisez un VPN.

utilisant un VPN still Clobberers IE 9 Performance

nous avons déjà déclaré à propos de la réduction du maximum nombre de connexions simultanées dans IE 8 lorsque votre PC utilise une connexion VPN. Cela s'est produit même si le navigateur la circulation ne passait pas que connexion.

malheureusement, IE 9 est affecté par VPN raccordements de la même manière:

6
répondu Kevin Hakanson 2011-05-25 18:55:09

j'ai écrit un seul fichier AJAX tester. Profitez-en!!! Juste parce que j'ai eu des problèmes avec mon hébergeur

<?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>

Edit:

R signifie "Temps d'attente".

Lorsque vous appuyez initialement sur le bouton de démarrage 80 (ou tout autre nombre) de la demande ajax concurrente sont lancés par javascript, mais comme on le sait, ils sont modifiés par le navigateur. Ils sont également demandés au serveur dans parallèle (limité à un certain nombre, c'est le fait de cette question). Ici les demandes sont résolus côté serveur avec un délai aléatoire (établi par w). À l'heure de début tout le temps nécessaire pour résoudre tous les appels ajax est calculé. Lorsque le test est terminé, vous pouvez voir s'il a pris la moitié, a pris la troisième, a pris un quart, etc du temps total, en déduisant ce qui était le parallélisme sur les appels au serveur. Ce n'est ni strict, ni précis, mais c'est agréable de voir en temps réel comment les appels AJAX sont complétés (voir la croix entrants). Et est un script autonome très simple pour montrer les bases d'ajax.

Bien sûr, cela suppose que le côté serveur n'introduit aucune limite supplémentaire.

Utiliser de préférence en conjonction avec firebug net panel (ou l'équivalent de votre navigateur)

6
répondu Luis Siquot 2014-06-10 20:36:28

a écrit mon propre test. testé le code sur stackoverflow, fonctionne bien me dit que chrome / FF peut faire 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();
});

il fonctionne pour la plupart des sites Web qui peuvent déclencher l'événement de changement readystate à des moments différents. (alias: de rinçage)

je remarque sur mon noeud.js server que j'ai dû sortir au moins 1025 octets pour déclencher l'événement/flush. sinon les événements déclencheraient juste les trois états à la fois quand la requête est complète donc voici mon arrière-plan:

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

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

app.listen(80);

mise à Jour

je remarque que vous pouvez maintenant avoir jusqu'à la requête 2x si vous utilisez à la fois l'api xhr et fetch en même temps.""

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
répondu Endless 2015-10-28 01:42:25

je crois qu'il y a un nombre maximum de requêtes http simultanées que les navigateurs feront pour le même domaine, qui est de l'ordre de 4 à 8 requêtes selon les paramètres de l'utilisateur et le navigateur.

vous pouvez configurer vos requêtes pour aller dans des domaines différents, ce qui peut être faisable ou non. Les gars de Yahoo ont fait beaucoup de recherche dans ce domaine, que vous pouvez lire sur ( ici ). Rappelez-vous que chaque nouveau domaine que vous ajoutez nécessite également un DNS Lookup. Les gars de YSlow recommandent entre 2 et 4 domaines pour obtenir un bon compromis entre les requêtes parallèles et les recherches DNS, bien que cela se concentre sur le temps de chargement de la page, pas sur les requêtes AJAX ultérieures.

puis-je vous demander pourquoi vous voulez faire autant de demandes? Il y a de bonnes raisons pour que les navigateurs limitent le nombre de requêtes au même domaine. Il est préférable de regrouper les demandes si possible.

0
répondu cbp 2009-02-19 01:00:08