ajax - error - xmlhttprequest status
¿Cuántas solicitudes concurrentes de AJAX(XmlHttpRequest) están permitidas en los navegadores populares? (8)
En Firefox 3, la respuesta es 6 por dominio: tan pronto como un 7th XmlHttpRequest (en cualquier pestaña) al mismo dominio se dispara, se pone en cola hasta que finalice uno de los otros 6.
¿Cuáles son los números para los otros navegadores principales?
Además, ¿existen formas de evitar estos límites sin que mis usuarios modifiquen la configuración de su navegador? Por ejemplo, ¿hay límites en el número de solicitudes jsonp (que usan inyección de etiquetas de script en lugar de un objeto XmlHttpRequest)?
Antecedentes: mis usuarios pueden realizar XmlHttpRequests desde una página web al servidor, pidiéndole al servidor que ejecute los comandos ssh en hosts remotos. Si los hosts remotos están inactivos, el comando ssh tarda unos minutos en fallar, lo que eventualmente evita que mis usuarios ejecuten más comandos.
Acabo de consultar con www.browserscope.org y con IE9 y Chrome 24 puede tener 6 conexiones simultáneas a un solo dominio, y hasta 17 a múltiples.
Con IE6 / IE7 se puede modificar el número de solicitudes simultáneas en el registro. Aquí es cómo establecerlo en cuatro cada uno.
[HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Internet Settings]
"MaxConnectionsPerServer"=dword:00000004
"MaxConnectionsPer1_0Server"=dword:00000004
Creo que hay un número máximo de solicitudes http simultáneas que los navegadores realizarán al mismo dominio, que es del orden de 4-8 solicitudes, según la configuración del usuario y el navegador.
Puede configurar sus solicitudes para ir a diferentes dominios, lo que puede o no ser factible. Los chicos de Yahoo hicieron mucha investigación en esta área, sobre la que puedes leer ( here ). Recuerde que cada nuevo dominio que agregue también requiere una búsqueda de DNS. Los chicos de YSlow recomiendan entre 2 y 4 dominios para lograr un buen compromiso entre las solicitudes paralelas y las búsquedas de DNS, aunque esto se centra en el tiempo de carga de la página, no en las solicitudes AJAX posteriores.
¿Puedo preguntar por qué quieres hacer tantas solicitudes? Hay buenas razones para que los navegadores limiten el número de solicitudes al mismo dominio. Estarás mejor de agrupar las solicitudes si es posible.
Escribió mi propia prueba. probado el código en , funciona bien, me dice que Chrome / FF puede hacer 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();
});
funciona para la mayoría de los sitios web que pueden desencadenar eventos de cambio de estado listo en diferentes momentos. (alias: enrojecimiento)
Noté en mi servidor node.js que tuve que generar al menos 1025 bytes para desencadenar el evento / vaciar. de lo contrario, los eventos solo activarán los tres estados a la vez cuando la solicitud esté completa, así que aquí está mi 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);
Actualizar
Observo que ahora puede tener hasta 2x solicitudes si está usando tanto xhr como fetch api al mismo tiempo.
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();
});
He escrito un solo archivo AJAX probador. ¡¡¡Disfrútala!!! Solo porque he tenido problemas con mi proveedor de hosting
<?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>
Editar:
r significa fila y w tiempo de espera.
Cuando presiona inicialmente el botón de inicio 80 (o cualquier otro número) de solicitud de ajax concurrente, se inician con javascript, pero como se sabe, el navegador las pone en cola. También se solicitan al servidor en paralelo (limitado a cierto número, este es el hecho de esta pregunta). Aquí se resuelven las solicitudes del lado del servidor con un retraso aleatorio (establecido por w). A la hora de inicio se calcula todo el tiempo necesario para resolver todas las llamadas ajax. Cuando finaliza la prueba, puede ver si tomó la mitad, la tercera, la cuarta parte, etc. del tiempo total, deduciendo cuál era el paralelismo en las llamadas al servidor. Esto no es estricto, ni preciso, pero es agradable ver en tiempo real cómo se completan las llamadas ajaxs (ver la cruz entrante). Y es un script autocontenido muy simple para mostrar los conceptos básicos de ajax.
Por supuesto, esto supone que el lado del servidor no está introduciendo ningún límite adicional.
Preferiblemente, use en conjunto con el panel de red firebug (o el equivalente de su navegador)
Los resultados de la red en Browserscope brindarán tanto conexiones por nombre de host como conexiones máximas para navegadores populares. Los datos se recopilan mediante la ejecución de pruebas en usuarios "en libertad", por lo que se mantendrán actualizados.
Según IE 9 - ¿Qué ha cambiado? en el blog HttpWatch, IE9 todavía tiene un límite de 2 conexiones cuando está sobre VPN.
Usando un VPN Still Clobbers IE 9 Performance
Anteriormente informamos sobre la reducción del número máximo de conexiones simultáneas en IE 8 cuando su PC utiliza una conexión VPN. Esto sucedió incluso si el tráfico del navegador no pasó por esa conexión.
Desafortunadamente, IE 9 se ve afectado por las conexiones VPN de la misma manera:
Un truco que puede utilizar para aumentar el número de conexiones simultáneas es alojar sus imágenes de un subdominio diferente. Estos serán tratados como solicitudes separadas, cada dominio es lo que se limitará al máximo concurrente.
IE6, IE7 - tienen un límite de dos. IE8 es 6 si tienes una banda ancha - 2 (si es un dial up).