2012-04-25 11 views
6

Intentaré hacer que mi primera publicación sea lo más interesante posible.Servidor WebSocket en PHP sin daemons?

Últimamente he estado interesado en la viabilidad de manejar las solicitudes de WebSocket en un servidor de alojamiento compartido.

No me digas "mejora tu plan". Todo esto sería trivial en al menos un VPS. Me di cuenta que.

Como muchos saben, los servidores compartidos se ...

  • Matar a un demonio si ven uno
  • el uso de bloques de sockets de servidor
  • Denegar el acceso de desembolsar
  • Mantener fuera del alcance de apache (no hay instalaciones de módulos)

Estas restricciones eliminan por completo a phpwebsocket, python. Se necesita una solución no demoníaca que se disfrace de página web.

PHP siendo mi idioma favorito del lado del servidor, diseñé un gateway websocket de PHP que se hacía pasar por una página web.

Hasta ahora he tenido éxito al enviar los encabezados correctos para el handshake y la salida de transmisión (usando buffer de salida), pero todavía no puedo encontrar la manera de continuar leyendo datos después de la solicitud inicial.

En resumen, quiero seguir recibiendo datos del cliente incluso después de que se inicie el script PHP. He intentado leer el php: // input pseudofile, pero parece que no puedo obtener más lecturas después del final del GET. ¿Hay algún ajuste o hack que permita esto?

Gracias!

+0

Si no tiene un daemon, ¿qué manejaría exactamente el tráfico en el websocket? Esto suena como una receta para la frustración en el mejor de los casos ... – sarnold

+0

Apache es el daemon. Llamará a mi script php cuando entre una conexión de websocket. – user1354999

+0

Apache estará feliz de obtener scripts que tardan demasiado en ejecutarse; ¿Estás bien trabajando solo de tres a cinco minutos más o menos? – sarnold

Respuesta

0

Después de que se complete el protocolo de enlace WebSocket, funciona de manera similar a los conectores normales. No hay ninguna razón por la cual Apache permita la comunicación unidireccional sin encabezados.

0

Su problema aquí es Apache. Una vez que Apache ha leído la primera solicitud de HTTP (handshake de websocket) continuará leyendo desde la conexión TCP para cualquier solicitud HTTP adicional. Por lo tanto, cualquier nuevo envío de datos en la conexión TCP nunca se transmitirá a su secuencia de comandos. Esto es necesario ya que el protocolo HTTP/1.1 es compatible con Keep-Alive de forma predeterminada, lo que significa que se realizan múltiples ciclos de solicitud/respuesta en una conexión TCP. El navegador no abre una conexión HTTP para cada solicitud (que era la predeterminada en HTTP/1.0). No puedes cambiar este comportamiento. Para implementar un servidor websocket necesitará configurar su propio socket.

5

la versión corta: lo que estás tratando de hacer simplemente no es posible.

la versión larga: lo mejor que puede obtener es un canal de comunicación unidireccional que se parece a una conexión websocket en su navegador, pero que solo funciona en una dirección. Del servidor al navegador. La otra dirección simplemente no funcionará, porque el servidor web no es consciente de que está tratando de usar un protocolo diferente de HTTP, y no hay forma de contarlo. Al menos no en el escenario que acabas de describir.

Cuestiones relacionadas