¿Usando cometa con PHP?
Estaba pensando en implementar un chat en tiempo real usando un backend PHP, pero encontré este comentario en un sitio que hablaba de cometa:
Tengo entendido que PHP es un lenguaje terrible para Comet, porque Comet requiere que mantengas una conexión persistente abierta a cada cliente del navegador. Usar mod_php esto significa dedicar un hijo de Apache a tiempo completo para cada cliente que no escala en absoluto. La gente que conozco que hace cosas de Comet usa principalmente Twisted Python, que está diseñado para manejar cientos o miles de conexiones simultáneas.
¿Es esto cierto? ¿O es algo que se puede configurar?
De acuerdo/ampliando lo ya dicho, no creo que FastCGI resuelva el problema.
apache
Cada solicitud a Apache utilizará un subproceso de trabajo hasta que se complete la solicitud, lo que puede llevar mucho tiempo para las solicitudes de COMET.
Este artículo sobre Ajaxian menciona el uso de COMET en Apache y que es difícil. El problema no es específico de PHP y se aplica a cualquier módulo CGI de back-end que desee utilizar en Apache.
La solución sugerida fue utilizar el módulo MPM de 'evento' que cambia la forma en que se envían las solicitudes a los subprocesos de trabajo.
Este MPM intenta solucionar el 'problema de mantener vivo' en HTTP. Después de que un cliente completa la primera solicitud, el cliente puede mantener la conexión abierta y enviar más solicitudes utilizando el mismo socket. Esto puede ahorrar una importante sobrecarga al crear conexiones TCP. Sin embargo, Apache tradicionalmente mantiene un proceso/hilo secundario completo esperando datos del cliente, lo que trae sus propias desventajas. Para resolver este problema, este MPM utiliza un subproceso dedicado para manejar tanto los sockets de escucha como todos los sockets que están en estado Keep Alive.
Desafortunadamente, eso tampoco funciona, porque sólo se "pospondrá" después de que se complete una solicitud, esperando una nueva solicitud del cliente.
PHP
Ahora, considerando el otro lado del problema, incluso si resuelve el problema reteniendo un hilo por solicitud de cometa, aún necesitará un hilo PHP por solicitud; es por eso que FastCGI no ayudará.
Necesita algo como Continuaciones que permitan que las solicitudes de los cometas se reanuden cuando se observe el evento que las provocó. AFAIK, esto no es algo posible en PHP. Solo lo he visto en Java; consulte el servidor Apache Tomcat .
Editar:
Hay un artículo aquí sobre el uso de un equilibrador de carga ( HAProxy ) que le permite ejecutar tanto un servidor Apache como un servidor habilitado para Comet (por ejemplo, Jetty, Tomcat para Java) en el puerto 80 del mismo servidor.
Podrías usar Nginx y JavaScript para implementar un sistema de chat basado en Comet que sea muy escalable con poca memoria o utilización de CPU.
Tengo un ejemplo muy simple aquí que puede ayudarte a comenzar. Cubre la compilación de Nginx con el módulo NHPM e incluye código para roles simples de editor/suscriptor en jQuery, PHP y Bash.
http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/