Tengo una aplicación PHP que recibe muchas llamadas ajax.
Me he dado cuenta de que cuando dos o más llamadas ocurren al mismo tiempo y no se ejecutan al mismo tiempo, la primera debe detenerse para que la segunda se ejecute.
He creado una pequeña prueba para intentar solucionar este problema. Tengo un html así:Conexiones simultáneas con Apache procedentes del mismo cliente
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
</head>
<body>
<a href="test.php">Test</a>
<button>Click</button>
<button>Click</button>
<button>Click</button>
<button>Click</button>
<script type="text/javascript">
$('button').click(function() {
$.get("test.php");
});
</script>
</body>
</html>
El prueba.php contiene:.
<?php
sleep(2);
echo 'Test';
?>
Así que, después de ejecutar $ ('botón') haga clic en() en las herramientas de desarrollo (o incendiario) consolar a la las solicitudes suceden al mismo tiempo pero devuelven las respuestas 2 segundos después de la última, en lugar de que las cuatro regresen al mismo tiempo (2 segundos más tarde).
Bueno, traté de abrir en otros navegadores, al mismo tiempo, este archivo y funcionó, se ejecutó al mismo tiempo. Quiero decir, ejecutar esto en Chrome y abrir la página en una pestaña muestra la 'Prueba' en 2 segundos mientras que las respuestas de las solicitudes Chrome Ajax aparecen 2 segundos después de finalizar la última solicitud, por lo que otra solicitud del navegador no tiene efecto en la primera una llamada (que probaría que se trata de un problema de sesión, pero vea abajo).
Lo mismo ocurre si abro varias pestañas para test.php.
He intentado cambiar la sesión a Memcache - La gente decía, en otras preguntas, que la sesión podría estar bloqueada. Tiene mucho sentido, pero incluso después de cambiar de archivos a Memcache, el problema persiste (y el script no tiene sesión, y session_autostart está desactivado)
Realmente soy un problema de configuración con Apache, ya que en el primer momento después de un tiempo, si ejecuto el script, ejecutará las 4 llamadas ajax al mismo tiempo. Estoy pensando en alguna protección DoS o algo así.
De todos modos, cualquier ayuda sería muy apreciada!
Ok, se solucionó el problema.
¡Después de todo, era un problema de bloqueo de sesión, el problema es que la memcached también bloquea la sesión!
Tuve que instalar php_memcached 2.0.1 que tiene un indicador de bloqueo en memcached.ini y usar esa versión. Resuelve el problema.
Aunque cuando una solicitud es para la misma url (en el ejemplo anterior utilicé test.php 4 veces) todavía se ejecuta de a una por vez. Estoy bastante seguro de que ese es el comportamiento correcto, ya que no tiene mucho sentido pedir un recurso muchas veces al mismo tiempo. Cambié mi ejemplo para solicitar test1.php, test2.php y así sucesivamente y funcionó bien. También funciona si se cambia la cadena de consulta.
Gracias por su ayuda!
PD: ¿No tiene la reputación de responder a mi propia pregunta tan temprano así que aquí está la respuesta
intente agregar un número aleatorio como una cadena de consulta a su solicitud para asegurarse de que no es un problema de almacenamiento en caché, como '$ .get (" test.php? "+ Date.now());' – lunixbochs
Quiere hacer todas las solicitudes al mismo tiempo? ¿O quieres evitar esto? – kuba
Quiero hacer todo simultáneamente. Noté que es incorrecto probar la misma URL. Luego probé test1.php aunque test4.php. El problema persistió pero encontré lo que estaba causando, responderé con la solución. – filaruina