web-dev-qa-db-fra.com

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'un 7ème XmlHttpRequest (sur un onglet) du même domaine est déclenché, il est mis en file d'attente jusqu'à la fin de l'un des 6 autres.

Quels sont les chiffres pour les autres principaux navigateurs?

En outre, existe-t-il un moyen de contourner ces limites sans que mes utilisateurs modifient les paramètres de leur navigateur? Par exemple, le nombre de requêtes jsonp est-il limité (utilisant l'injection de balise de script plutôt qu'un objet XmlHttpRequest)?

Arrière-plan: mes utilisateurs peuvent créer XmlHttpRequests d'une page Web sur le serveur, en lui demandant d'exécuter des commandes ssh sur des hôtes distants. Si les hôtes distants sont hors service, l'échec de la commande ssh prend quelques minutes, ce qui empêche éventuellement les utilisateurs d'exécuter d'autres commandes.

350
Michael Gundlach

Une astuce que vous pouvez utiliser pour augmenter le nombre de connexions simultanées consiste à héberger vos images à partir d'un sous-domaine différent. Celles-ci seront traitées comme des requêtes distinctes, chaque domaine étant ce qui sera limité au maximum simultané.

IE6, IE7 - limite de deux. IE8 est 6 si vous avez un haut débit - 2 (si c'est un dial up).

139
Bob

Les résultats du réseau sur Browserscope vous donneront les deux connexions par nom d’hôte et nombre maximal de connexions pour les navigateurs populaires. Les données sont recueillies en exécutant des tests sur les utilisateurs "dans la nature", afin qu'elles restent à jour.

102
Kevin Hakanson

Avec IE6/IE7, vous pouvez modifier le nombre de demandes simultanées dans le registre. Voici comment le régler à quatre chacun.

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

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
xmorera

Selon IE 9 - Qu'est-ce qui a changé? sur le blog HttpWatch, IE9 a toujours une limite de 2 connexions lorsque VPN est actif.

Utilisation d'un VPN Still Clobbers IE 9 Performance

Nous avions précédemment signalé la réduction du nombre maximal de connexions simultanées dans IE 8 lorsque votre PC utilise une connexion VPN. Cela se produit même si le trafic du navigateur ne passe pas par cette connexion.

Malheureusement, IE 9 est affecté de la même manière par les connexions VPN:

6
Kevin Hakanson

J'ai écrit un seul fichier AJAX testeur. Profitez-en!!! Juste parce que j'ai eu des problèmes avec mon fournisseur d'hébergement

<?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 en ligne et w.
Lorsque vous appuyez sur le bouton de démarrage, 80 (ou tout autre nombre) de demandes ajax simultanées sont lancées par javascript, mais comme on le sait, elles sont spoulées par le navigateur. En outre, ils sont demandés au serveur en parallèle (limité à un certain nombre, c'est le fait de cette question). Ici, les requêtes sont résolues côté serveur avec un délai aléatoire (établi par w). Au moment du démarrage, tout le temps nécessaire pour résoudre tous les appels ajax est calculé. Lorsque le test est terminé, vous pouvez voir s’il prend moitié, troisième, quart, etc. du temps total, déduction faite du parallélisme des appels sur le serveur. Ce n’est ni strict, ni précis, mais il est agréable de voir en temps réel comment se terminent les appels ajaxs (voir la croix entrante). Et est un script autonome très simple pour montrer les bases de ajax.
Bien entendu, cela suppose que le côté serveur n'introduit aucune limite supplémentaire.
À utiliser de préférence avec le panneau firebug net (ou l’équivalent de votre navigateur)

6
Luis Siquot

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

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

Je remarque sur mon serveur node.js que je devais produire au moins 1025 octets pour déclencher l'événement/la chasse. sinon, les événements déclencheraient simplement les trois états en même temps lorsque la demande serait terminée. Voici donc mon backend:

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'à 2x demandes si vous utilisez simultanément xhr et fetch api

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

Je crois qu'il existe un nombre maximal de demandes HTTP simultanées que les navigateurs adresseront au même domaine, ce qui correspond à l'ordre de 4 à 8 demandes, en fonction des paramètres de l'utilisateur et du navigateur.

Vous pouvez configurer vos demandes pour accéder à différents domaines, ce qui peut être réalisable ou non. Les gars de Yahoo ont fait beaucoup de recherches dans ce domaine, que vous pouvez lire ( ici ). N'oubliez pas que chaque nouveau domaine que vous ajoutez nécessite également une recherche DNS. Les gars de YSlow recommandent entre 2 et 4 domaines de parvenir à 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 et non sur les requêtes ultérieures AJAX.

Puis-je vous demander pourquoi vous voulez faire autant de demandes? Les navigateurs ont de bonnes raisons de limiter le nombre de demandes au même domaine. Si possible, vous ferez mieux de grouper les demandes.

0
cbp