Сколько одновременных запросов AJAX (XmlHttpRequest) разрешено в популярных браузерах?
В Firefox 3 ответом является 6 на домен: как только 7-й запрос XmlHttpRequest (на любой вкладке) в тот же домен запускается, он ставится в очередь до тех пор, пока один из остальных 6 не завершится.
Какие номера для других основных браузеров?
Кроме того, есть ли способы обойти эти ограничения, если мои пользователи не изменят настройки своего браузера? Например, есть ли ограничения на количество запросов jsonp (которые используют инъекцию тега скрипта, а не объект XmlHttpRequest)?
Предыстория: Мои пользователи могут отправлять XmlHttpRequests с веб-страницы на сервер, запрашивая у сервера команды ssh на удаленных хостах. Если удаленные хосты не работают, команда ssh не работает в течение нескольких минут, что в итоге не позволяет моим пользователям выполнять какие-либо дальнейшие команды.
9 ответов
Один прием, который вы можете использовать для увеличения количества одновременных подключений, - это размещение ваших изображений из другого субдомена. Они будут рассматриваться как отдельные запросы, каждый домен - это то, что будет ограничено одновременным максимумом.
IE6, IE7 - имеют ограничение в два. IE8 равен 6, если у вас широкополосный доступ - 2 (если это набор).
Результаты поиска в сети на Browserscope предоставят вам как Соединения на имя хоста, так и Максимальное количество подключений для популярных браузеров. Данные собираются путем запуска тестов для пользователей "в дикой природе", поэтому они будут оставаться в курсе.
С IE6 / IE7 можно настроить количество одновременных запросов в реестре. Вот как установить четыре.
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000004
"MaxConnectionsPer1_0Server"=dword:00000004
Я только что проверил с http://www.browserscope.org/, а с IE9 и Chrome 24 вы можете иметь 6 одновременных подключений к одному домену и до 17 к нескольким.
Согласно IE 9 - Что изменилось? в блоге HttpWatch IE9 все еще имеет ограничение на 2 соединения при использовании VPN.
Использование VPN все еще увеличивает производительность IE 9
Ранее мы сообщали о сокращении максимального количества одновременных подключений в IE 8, когда ваш компьютер использует VPN-подключение. Это произошло, даже если трафик браузера не проходил через это соединение.
К сожалению, на IE 9 VPN-подключения влияют так же:
Я написал тестер 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> /2=<th>'+Math.ceil(what/2)+
'<td> /3=<th>'+Math.ceil(what/3)+
'<td> /4=<th>'+Math.ceil(what/4)+
'<td> /6=<th>'+Math.ceil(what/6)+
'<td> /8=<th>'+Math.ceil(what/8)+
'<td> (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 + '> '
$('#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> </table>
Elapsed Time: <span id="showTimer"></span>
<table id="debug"></table>
</center>
</body>
Редактировать:
r означает строку и w время ожидания.
Когда вы первоначально нажимаете кнопку 80 запуска (или любое другое число) одновременного запроса AJAX, запускаются JavaScript, но, как известно, они буферизируются браузером. Также они запрашиваются к серверу параллельно (ограничено определенным количеством, это факт этого вопроса). Здесь запросы решаются на стороне сервера со случайной задержкой (устанавливается w). Во время запуска вычисляется все время, необходимое для решения всех вызовов AJAX. Когда тест завершен, вы можете увидеть, заняло ли оно половину, третье, четверть и т. Д. От общего времени, вычитая из которого параллельность обращений к серверу. Это не строго и не точно, но приятно видеть в режиме реального времени, как завершаются вызовы ajaxs (видя входящий крест). И это очень простой автономный скрипт, демонстрирующий основы ajax.
Конечно, это предполагает, что на стороне сервера не вводится никаких дополнительных ограничений.
Предпочтительно использовать в сочетании с сетевой панелью firebug (или аналогом вашего браузера)
Написал мой собственный тест. проверил код на stackru, отлично работает говорит мне, что 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();
});
Я полагаю, что существует максимальное количество одновременных http-запросов, которые браузеры будут отправлять на один и тот же домен, что составляет порядка 4-8 запросов в зависимости от настроек пользователя и браузера.
Вы можете настроить свои запросы для перехода на другие домены, что может или не может быть осуществимо. Ребята из Yahoo провели много исследований в этой области, о которых вы можете прочитать ( здесь). Помните, что каждый новый домен, который вы добавляете, также требует поиска DNS. Ребята из YSlow рекомендуют от 2 до 4 доменов для достижения хорошего компромисса между параллельными запросами и поиском DNS, хотя это сосредоточено на времени загрузки страницы, а не на последующих AJAX-запросах.
Могу ли я спросить, почему вы хотите сделать так много запросов? У браузеров есть веские причины ограничивать количество запросов к одному домену. Вам будет лучше, если это возможно.
Хорошая причина перейти на http 2.0
При использовании http2.0 максимальное количество подключений на хост практически не ограничено: Увеличивается ли ограничение на количество подключений на хост с помощью HTTP/2?