Сколько одновременных запросов AJAX (XmlHttpRequest) разрешено в популярных браузерах? - PullRequest
347 голосов
/ 18 февраля 2009

В Firefox 3 ответом является 6 для домена: как только 7-й запрос XmlHttpRequest (на любой вкладке) в тот же домен запускается, он ставится в очередь до тех пор, пока не завершится один из 6 других.

Какие цифры для других основных браузеров?

Кроме того, есть ли способы обойти эти ограничения, если мои пользователи не изменят настройки своего браузера? Например, есть ли ограничения на количество запросов jsonp (которые используют инъекцию тега script, а не объект XmlHttpRequest)?

Справочная информация. Мои пользователи могут отправлять запросы XmlHttpRequest с веб-страницы на сервер, запрашивая у сервера команды ssh на удаленных хостах. Если удаленные хосты не работают, команда ssh не будет работать несколько минут, что в конечном итоге не позволит моим пользователям выполнять какие-либо дальнейшие команды.

Ответы [ 8 ]

138 голосов
/ 18 февраля 2009

Один прием, который можно использовать для увеличения числа одновременных подключений, - это размещение изображений из другого субдомена. Они будут обрабатываться как отдельные запросы, каждый домен ограничен одновременным максимумом.

IE6, IE7 - имеют ограничение в два. IE8 равен 6, если у вас широкополосный доступ - 2 (если это набор).

102 голосов
/ 30 августа 2010

Результаты сети в Браузер предоставят вам и Соединений на имя хоста и Макс. Соединений для популярных браузеров. Данные собираются путем запуска тестов для пользователей «в дикой природе», поэтому они будут обновляться.

24 голосов
/ 23 марта 2009

В IE6 / IE7 можно настроить количество одновременных запросов в реестре. Вот как установить его на четыре.

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000004
"MaxConnectionsPer1_0Server"=dword:00000004
7 голосов
/ 29 января 2013

Я только что проверил с www.browserscope.org и с IE9 и Chrome 24 вы можете иметь 6 одновременных подключений к одному домену и до 17 к нескольким.

6 голосов
/ 25 мая 2011

Согласно IE 9 - Что изменилось? в блоге HttpWatch, IE9 все еще имеет ограничение на 2 соединения при использовании VPN.

Использование VPN по-прежнему повышает производительность IE 9

Ранее сообщалось о сокращении максимума количество одновременных подключений в IE 8, когда ваш компьютер использует соединение VPN. Это случилось, даже если браузер движение не прошло подключение.

К сожалению, на IE 9 влияет VPN подключения аналогичным образом:

6 голосов
/ 13 апреля 2011

Я написал тестер AJAX для одного файла. Наслаждайся этим!!! Только потому, что у меня были проблемы с моим хостинг-провайдером

<?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 означает строку и w время ожидания.
Когда вы первоначально нажимаете кнопку 80 запуска (или любое другое число) одновременного запроса AJAX, запускаются JavaScript, но, как известно, они буферизируются браузером. Также они запрашиваются к серверу параллельно (ограничено определенным количеством, это факт этого вопроса). Здесь запросы решаются на стороне сервера со случайной задержкой (устанавливается w). Во время запуска вычисляется все время, необходимое для решения всех вызовов ajax. Когда тест завершен, вы можете увидеть, заняло ли оно половину, третье, четверть и т. Д. От общего времени, вычитая из которого параллельность обращений к серверу. Это не является строгим и не точным, но приятно видеть в реальном времени, как завершаются вызовы ajaxs (видя входящий крест). И это очень простой автономный скрипт, демонстрирующий основы ajax.
Конечно, это предполагает, что на стороне сервера не вводится никаких дополнительных ограничений.
Предпочтительно использовать вместе с сетевой панелью firebug (или аналогом вашего браузера)

4 голосов
/ 01 марта 2014

Написал мой собственный тест. проверил код на stackoverflow, отлично работает говорит мне, что 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();
});

работает для большинства веб-сайтов, которые могут вызывать событие изменения готовности в разное время. (иначе: промывка)

Я заметил на своем сервере 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);

Обновление

Я заметил, что теперь у вас может быть до 2х запросов, если вы одновременно используете xhr и 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();
});
0 голосов
/ 18 февраля 2009

Я полагаю, что существует максимальное количество одновременных http-запросов, которые браузеры будут отправлять на один и тот же домен, и это порядка 4-8 запросов в зависимости от настроек пользователя и браузера.

Вы можете настроить свои запросы для перехода на другие домены, что может быть или не быть возможным. Ребята из Yahoo провели много исследований в этой области, о которых вы можете прочитать ( здесь ). Помните, что каждый новый домен, который вы добавляете, также требует поиска DNS. Ребята из YSlow рекомендуют от 2 до 4 доменов для достижения хорошего компромисса между параллельными запросами и поиском DNS, хотя это сосредоточено на времени загрузки страницы, а не на последующих запросах AJAX.

Могу ли я спросить, почему вы хотите сделать так много запросов? У браузеров есть веские причины ограничивать количество запросов к одному домену. Вам будет лучше, если это возможно, объединять запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...