Ile jednoczesnych żądań AJAX (XmlHttpRequest) jest dozwolonych w popularnych przeglądarkach?

W Firefoksie 3 odpowiedź wynosi 6 na domenę: gdy tylko zostanie wywołany 7.XmlHttpRequest (na dowolnej karcie) do tej samej domeny, zostanie on ustawiony w kolejce, aż jedna z pozostałych 6 zakończy działanie.

Jakie są liczby dla innych głównych przeglądarek?

Czy istnieją sposoby obejścia tych limitów bez konieczności modyfikowania ustawień przeglądarki przez moich użytkowników? Na przykład, czy istnieją ograniczenia co do liczby żądań jsonp (które używają script tag injection zamiast obiektu XmlHttpRequest)?

Tło: Moi użytkownicy mogą wykonywać zapytania Xmlhttprequesty ze strony internetowej na serwer, prosząc serwer o uruchamianie poleceń ssh na zdalnych hostach. Jeśli zdalne hosty są wyłączone, polecenie ssh trwa kilka minut, aby zawieść, ostatecznie uniemożliwiając moim użytkownikom wykonywanie dalszych poleceń.

Author: Will, 2009-02-18

8 answers

Jedną z sztuczek, których możesz użyć, aby zwiększyć liczbę jednoczesnych połączeń, jest hostowanie obrazów z innej sub domeny. Będą one traktowane jako oddzielne żądania, każda domena jest tym, co będzie ograniczone do równoczesnego maksimum.

IE6, IE7-mają limit dwóch IE8 jest 6, Jeśli masz szerokopasmowy-2 (jeśli jest to dial up).

 137
Author: Bob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-07 20:07:00

Wyniki sieci w przeglądarce Browserscope dają zarówno połączenia według nazwy hosta, jak i maksymalne Połączenia dla popularnych przeglądarek. Dane są zbierane poprzez przeprowadzanie testów na użytkownikach "w dziczy", więc będą na bieżąco.

 101
Author: Kevin Hakanson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-30 03:27:17

Z IE6 / IE7 można dostosować liczbę jednoczesnych żądań w rejestrze. Oto, jak ustawić go na cztery każdy.

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000004
"MaxConnectionsPer1_0Server"=dword:00000004
 24
Author: brianegge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-23 02:36:31
 7
Author: xmorera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-03 13:06:57

Zgodnie z IE 9-co się zmieniło? na blogu HttpWatch, IE9 nadal ma limit połączenia 2, gdy przekracza VPN.

Korzystanie z VPN nadal hamuje wydajność IE 9

Wcześniej informowaliśmy o skalowaniu maksimum liczba jednoczesnych połączeń w IE 8 gdy komputer korzysta z połączenia VPN. Stało się to nawet wtedy, gdy przeglądarka korki nie przejechały połączenie.

Niestety, IE 9 ma wpływ na VPN połączenia w ten sam sposób:

 6
Author: Kevin Hakanson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-25 18:55:09

Napisałem pojedynczy plik AJAX tester. Smacznego!!! Tylko dlatego, że miałem problemy z moim dostawcą hostingu

<?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 oznacza czas oczekiwania rzędu i W.
Po pierwszym naciśnięciu przycisku start 80 (lub inna liczba) jednoczesnych żądań ajax są uruchamiane przez javascript, ale jak wiadomo, są one buforowane przez przeglądarkę. Również są one wymagane do serwera równolegle (ograniczona do określonej liczby, jest to fakt tego pytania). Tutaj prośby są rozwiązana strona serwera z losowym opóźnieniem (ustalonym przez w). W momencie rozpoczęcia obliczany jest cały czas potrzebny do rozwiązania wszystkich wywołań ajax. Po zakończeniu testu możesz sprawdzić, czy zajęło połowę, zajęło trzecie, zajęło ćwierć itp. całkowitego czasu, odliczając, co było równoległością na połączeniach z serwerem. Nie jest to ścisłe, ani precyzyjne, ale miło jest zobaczyć w czasie rzeczywistym, jak połączenia ajaxs są zakończone (widząc przychodzące krzyżyki). I jest bardzo prosty samodzielny skrypt, aby pokazać podstawy ajax.
Z oczywiście, to zakłada, że po stronie serwera nie wprowadza żadnych dodatkowych limitów.
Najlepiej używać w połączeniu z firebug net panel (lub odpowiednikiem przeglądarki)

 6
Author: Luis Siquot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-10 20:36:28

Napisałam własny test. testowałem kod na stackoverflow, działa dobrze mówi mi, że chrome / FF może zrobić 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();
});

Działa dla większości stron internetowych, które mogą wyzwalać zdarzenie zmiany readystate w różnym czasie. (aka: flushing)

Zauważyłem na moim węźle.serwer js, który musiałem wypisać co najmniej 1025 bajtów, aby wywołać zdarzenie / kolor. w przeciwnym razie zdarzenia po prostu wyzwalają wszystkie trzy stany na raz, gdy żądanie jest kompletne, więc oto mój 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);

Update

Zauważyłem, że teraz możesz mieć do 2x żądanie, jeśli używasz zarówno API xhr, jak i fetch w tym samym czasie

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
Author: Endless,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-28 01:42:25

Uważam, że istnieje maksymalna liczba jednoczesnych żądań http, które przeglądarki będą wysyłać do tej samej domeny, która jest w kolejności 4-8 żądań w zależności od ustawień użytkownika i przeglądarki.

Możesz skonfigurować swoje żądania, aby przejść do różnych domen, co może, ale nie może być wykonalne. Ludzie Yahoo zrobili wiele badań w tej dziedzinie, o których można przeczytać ( TUTAJ ). Pamiętaj, że każda nowa domena, którą dodajesz, wymaga również Wyszukiwania DNS. Faceci YSlow polecają między 2 i 4 domeny, aby osiągnąć dobry kompromis między równoległymi żądaniami i wyszukiwaniami DNS, chociaż koncentruje się to na czasie ładowania strony, a nie kolejnych żądaniach AJAX.

Mogę zapytać, dlaczego chcesz składać tyle próśb? Istnieją dobre powody, dla których przeglądarki ograniczają liczbę żądań do tej samej domeny. Lepiej będzie, jeśli to możliwe, łączyć wnioski.

 0
Author: cbp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-19 01:00:08