2010-06-07 18 views
11

Estoy intentando establecer una conexión persistente HTTP desde una aplicación Silverlight a una página PHP (es decir, sin crear una nueva conexión TCP para cada solicitud HTTP) alojada por un servidor Apache."Conexión: Keep-Alive" en la respuesta del servidor

Para este fin, necesito que el servidor web envíe sus respuestas HTTP con el encabezado "Conexión" establecido en "Mantener vivo". Del lado del cliente, no parece haber ningún problema ya que la API de red proporcionada por Silverlight es básicamente una envoltura de las capacidades de la red del navegador, por lo que he leído: entonces, si el navegador es compatible con HTTP 1.1 y Conexión: Keep-Alive por defecto para sus solicitudes, está bien. Content-Length también está bien definido, por lo que el servidor sabe cuando tiene que enviar la respuesta. Sin embargo, la respuesta del servidor a la solicitud PHP establece sistemáticamente "Conexión:" a "cerrar", lo que termina la conexión y evita una conexión persistente.

He intentado algunas cosas para solucionar este problema: diferentes métodos (GET y POST), dando explícitamente una "conexión: keep-alive" a la respuesta con el siguiente código PHP al comienzo de mi script:

header("Connection: Keep-alive"); 

Este último agrega el encabezado esperado a la respuesta, lo que es bueno, pero una "Conexión: cierre" adicional se agrega más adelante en los encabezados de respuesta.

¿Es una característica de PHP o Apache que impone "cerrar" (por algún motivo de seguridad o rendimiento, supongo) o me falta algo aquí?

Gracias de antemano.

P.S. : Al olfatear paquetes, he notado que no muchos sitios web usan "Keep-alive" y se restablece la conexión TCP. ¿Keepalive no es el comportamiento predeterminado y preferido en HTTP 1.1?

+0

Eso es probablemente Apache, PHP no - a lo mejor de mi conocimiento, PHP no tiene control sobre eso. Puede verificar intentando solicitar un archivo estático a través de la misma conexión. Directiva Apache: http://httpd.apache.org/docs/2.2/mod/core.html#keepalive –

Respuesta

24

La funcionalidad Keep-Alive no está pensada para conexiones persistentes.

Keep-Alive está destinado a reducir el número de conexiones para un sitio web. En lugar de crear una nueva conexión para cada imagen/css/javascript en una página web, muchas solicitudes se realizarán reutilizando la misma conexión.

Existen algunas configuraciones que también lo impiden en Apache, como el número máximo de solicitudes en una conexión o los tiempos de espera entre las solicitudes. Esto también consumirá tus recursos muy rápido porque cada conexión necesita su propio hilo.

Debe cambiar a otra solución, que esté hecha para ese tipo de trabajo.

Para los servicios que mantienen su conexión abierta se puede echar un vistazo a http://orbited.org y http://twistedmatrix.com/trac/

+1

+1 por no abusar de HTTP para las conexiones persistentes. Es bastante fácil dejar que un daemon PHP escuche un puerto/socket si es necesario. – Wrikken

+0

sí, eso también es una posibilidad.en mi opionion orbited puede hacer eso mucho más fácil y es más estable al tiempo que proporciona un servidor http básico :) – favo

+0

Estoy programando una aplicación de mensajería instantánea en tiempo real (algo así como Google Wave para el aspecto de tiempo real) en un contexto restringido (Funciones PHP y minimal del servidor web). Ni siquiera estoy autorizado a usar bases de datos. En este tipo de solicitud de presión (cada golpe de teclado básicamente genera una solicitud), sería útil mantener viva la conexión con el servidor. Gracias por su consejo. – ZenithM

5

A partir de PHP no gestiona la conexión HTTP, que no tiene manera de cambiar esta configuración. Debe configurar eso en los servidores. Por ejemplo, puede habilitar el mantenimiento de conexión de este tipo en Apache si está utilizando mod_php,

KeepAlive On 
+0

Gracias, este parámetro parece estar desactivado en mi servidor. – ZenithM

Cuestiones relacionadas