2012-04-10 13 views
6


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

+2

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

+0

Quiere hacer todas las solicitudes al mismo tiempo? ¿O quieres evitar esto? – kuba

+0

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

Respuesta

-2

peticiones HTTP son independientes entre sí - por definición, el protocolo HTTP no tiene estado. Cada $.get() que realiza es una solicitud http completamente independiente y NUEVA, por lo que termina con 4 solicitudes HTTP, 4 llamadas sleep() separadas y 4 salidas separadas del servidor.

+0

Su respuesta no podría estar más fuera del tema. – frostymarvelous

6

en mi caso la función:

session_write_close();

solucionado mi problema

tengo el próximo programa, una página principal que llamar de forma recurrente un archivo llamado ajax ajax.php. Se llama cada "n" segundos.

Y, mi formulario tiene un botón que devuelve un informe que se llama a través de ajax (** reporte.php **) Se llama solo a petición del usuario (clic) y podría tomar un minuto para generar el resultado.

mayoría de las veces, ajax.php toma 20ms a correr, pero, si report.php está ejecutando el ajax.php es congele hasta reporte.php terminar la tarea. Y lo peor, ajax.php podría ser apilado.

reporte.php (antes)

<?php 
// Some PHP Code goes here. 
// The rest of the PHP code (mostly, the slow part of the process). 
?> 

reporte.php (después de la corrección)

<?php 
// Some PHP Code goes here. (ideal if it is the fast part). 
session_write_close(); // fix for concurrent ajax 
// The rest of the PHP code (mostly, the slow part of the process). 
?> 

Antes de la solución (una captura de pantalla de plugins de Firefox Firebug): before

Después de la solución after

Comprueba cómo antes de que la solución, reporte.php y ajax.php sigan cargando (y ajax se ha apilado en varias llamadas). Y cómo después de la solución, reporte.php se está cargando mientras cada llamada ajax consecutiva ya está cargada.

Tenga en cuenta que después de la función session_write_close(), no es posible (ni se recomienda) utilizar ninguna función y valor de sesión.

+0

Resolvió mi problema. Notó que una solicitud menos intensa volvía un segundo después. Profiled, tested, server code was fine. Entonces noté que eran solicitudes simultáneas. La sesión cerrada lo arregló – frostymarvelous

Cuestiones relacionadas