2010-09-02 8 views
7

No estoy seguro de cómo formular correctamente esta pregunta, así que comenzaré con el escenario que encontré.¿Por qué apache no procesa varias solicitudes desde el mismo navegador simultáneamente?

Tengo un poco de procesamiento en mi aplicación web que lleva más tiempo del que me gustaría que esperara el usuario para tener el control de la página nuevamente, así que decidí que se procesara mediante una solicitud de AJAX.

El problema es que, aunque descargué esta solicitud en una solicitud ajax, parece que apache no procesará ninguna otra solicitud hasta que se complete la solicitud pesada del procesador original.

Originalmente quería saber cómo podría solucionar este problema, pero desde entonces he decidido que podría ser una mala idea en general.

Sin embargo, todavía tengo curiosidad si alguien sabe por qué apache se comporta de esta manera y qué (si alguna) directiva de configuración lo controla. Mi pensamiento original era KeepAlive, pero deshabilitar eso no pareció cambiar el comportamiento.

Estoy ejecutando PHP a través de mod_php si eso hace la diferencia.

¡Agradezco cualquier ayuda que haya recibido en la dirección correcta!

+0

ServerFault es más probable que tenga la respuesta a esto. – Amber

+0

Gracias, ámbar, probablemente tienes razón en que debería haber publicado allí, pero resulta que mi malentendido del problema me llevó al lugar correcto :-) –

Respuesta

11

¿Estás utilizando sesiones basadas en archivos? PHP bloqueará los archivos de sesión para cada solicitud y mantendrá ese bloqueo hasta que realice un session_write_close() o el script finalice o finalice. El efecto secundario de esto es que todas las solicitudes se vuelven seriales, ya que todas contestan por el mismo recurso único (el archivo de sesión).

+0

En la mayoría de los sistemas de producción en buen estado, probablemente utilizará otro manejador de sesión, como memcached. Pero sí, es una posibilidad. – Artefacto

+0

Eso debe ser, hasta donde yo sé, las sesiones están basadas en archivos. ¡Parece un buen momento para intentar mudarte a memcached! Gracias! –

+0

Antes de tener que ir a memcached puedes hacer todas las cosas basadas en la sesión al principio. Luego ciérralo. Copie la variable de sesión en una variable temporal para que pueda cerrarla y luego, si necesita establecer un valor de sesión, ábralo y realice el cambio y luego ciérrelo rápidamente. He añadido esto a mi respuesta a continuación también. – PHPGuru

0

¿Puedes señalar evidencia de que es apache? A menos que su configuración de apache no sea óptima, lo más probable es que la espera de su página sea otra cosa, ¿tal vez ha configurado su llamada ajax como no asincrónica?

+0

Gracias por la sugerencia- No tengo evidencia de que sea apache - aparte de que no sabía qué más sería. Utilizo open ('GET', url, verdadero), por lo que la llamada debe ser asincrónica –

2

Estoy seguro de que es el archivo de la sesión. Tengo el mismo problema. Ejecuto una solicitud larga, como una inserción SQL de PHPMyAdmin, que tarda varios minutos en procesarse. Mientras se procesa, intento abrir una nueva pestaña en el mismo navegador e ir a cualquier página de mi sitio web y no irá hasta que se complete la solicitud original de PHPMyAdmin. Si abro una ventana de incógnito en Chrome, que es el mismo navegador, funciona bien. Si abro el sitio web en cualquier otro navegador, está bien. Por lo tanto, es probablemente la sesión basada en archivos que es la predeterminada para PHP.

Otros han mencionado que van a memcached. También puede guardar sesiones en la base de datos. Antes de tener que ir a memcached, puedes hacer todas las cosas basadas en la sesión al principio. Copie la variable de sesión en una variable temporal para que pueda cerrarla y luego cerrarla. Y luego, si necesita establecer un valor de sesión más tarde, ábralo y realice el cambio y luego ciérrelo rápidamente.

+1

Tenía el mismo problema. Resuelto al cerrar la sesión lo antes posible. – BI2O2T

Cuestiones relacionadas