Сколько одновременных запросов AJAX (XmlHttpRequest) разрешено в популярных браузерах?
в Firefox 3 Ответ составляет 6 на домен: как только запускается 7-й XmlHttpRequest (на любой вкладке) В тот же домен, он ставится в очередь до тех пор, пока один из других 6 не завершится.
каковы цифры для других основных браузеров?
кроме того, есть ли способы обойти эти ограничения, не заставляя моих пользователей изменять настройки браузера? Например, существуют ли ограничения на количество запросов jsonp (которые используют инъекцию тега сценария, а не XmlHttpRequest объект)?
фон: мои пользователи могут создавать XmlHttpRequests с веб-страницы на сервер, запрашивая сервер для запуска команд ssh на удаленных хостах. Если удаленные хосты не работают, команда ssh занимает несколько минут для сбоя, в конечном итоге не позволяя моим пользователям выполнять какие-либо дополнительные команды.
8 ответов:
один трюк, который вы можете использовать для увеличения числа одновременных подключений, - это размещение ваших изображений из другого поддомена. Они будут рассматриваться как отдельные запросы, каждый домен, что будет ограничено параллельный максимум.
IE6, IE7 - имеют ограничение в два. IE8 - это 6, если у вас есть широкополосный доступ - 2 (если это набор).
результаты сети в Browserscope даст вам обоим соединения на Имя хоста и Максимальное Количество Соединений для популярных браузеров. Данные собираются путем выполнения тестов на пользователей "в дикой природе", так что он будет оставаться в курсе.
С помощью IE6 / IE7 можно настроить количество одновременных запросов в реестре. Вот как установить его на четыре каждый.
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings] "MaxConnectionsPerServer"=dword:00000004 "MaxConnectionsPer1_0Server"=dword:00000004
Я только что проверил с www.browserscope.org и с IE9 и Chrome 24 вы можете иметь 6 одновременных подключений к одному домену и до 17 к нескольким.
по данным IE 9-Что изменилось? в блоге HttpWatch IE9 по-прежнему имеет ограничение на подключение 2 при использовании VPN.
использование VPN все еще сбивает производительность IE 9
мы ранее сообщали об уменьшении максимального значения количество одновременных подключений в IE 8 Когда ваш компьютер использует VPN-соединение. Это произошло даже если браузер трафик не пошел через это соединение.
к сожалению, IE 9 зависит от VPN соединения таким же образом:
Я написал один файл AJAX tester. Наслаждайся этим!!! Просто потому, что у меня были проблемы с моим хостинг-провайдера
<?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>Edit:
r означает время ожидания строки и W.
При первоначальном нажатии кнопки Пуск 80 (или любое другое число) параллельные ajax-запросы запускаются javascript, но, как известно, они буферизуются браузером. Также они запрашиваются на сервер параллельно (ограничено определенным числом, это факт этого вопрос.) Здесь запросы решаются на стороне сервера со случайной задержкой (установленной w). Во время запуска вычисляется все время, необходимое для решения всех вызовов ajax. Когда тестирование закончится, вы можете увидеть, если он взял половину, взял третий, взял четверть и т. д. от общего времени, вычета, который был параллельность на вызовы к серверу. Это не строго и не точно, но приятно видеть в реальном времени, как завершаются вызовы ajaxs (видя входящий крест). И очень простой сдержанный скрипт, чтобы показать основы ajax.
Конечно, это предполагает, что серверная сторона не вводит никаких дополнительных ограничений.
Предпочтительно использовать в сочетании с firebug net panel (или эквивалентом Вашего браузера)
написал свой тест. протестировал код на 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(); });он работает для большинства веб-сайтов, которые могут вызвать событие изменения readystate в разное время. (ака: покраснение)
Я заметил на моем узле.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);обновление
Я заметил, что теперь вы можете иметь до 2x запрос, если вы используете как 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.
могу я спросить, почему вы хотите сделать так много запросов? Есть веские причины для браузеров ограничивает количество запросов к одному домену. Вам будет лучше связывать запросы, если это возможно.
Comments