Estaba pensando en implementar el chat en tiempo real usando un backend PHP, pero encontré este comentario en un sitio que habla de cometa:
Tengo entendido que PHP es un lenguaje terrible para Comet, porque Comet requiere que mantenga abierta una conexión persistente para cada cliente de navegador. Usar mod_php significa ocupar un niño Apache a tiempo completo para cada cliente que no escala en absoluto. Las personas que conozco que hacen cosas de Comet utilizan 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?
Respuestas:
Al estar de acuerdo / expandir lo que ya se ha dicho, no creo que FastCGI resuelva el problema.
apache
Cada solicitud en Apache utilizará un hilo de trabajo hasta que se complete la solicitud, lo que puede ser mucho tiempo para las solicitudes 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 hilos de trabajo.
Desafortunadamente, eso tampoco funciona, porque solo 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 de mantener un hilo por solicitud de cometa, aún necesitará un hilo de PHP por solicitud; esta es la razón por la que FastCGI no ayudará.
Necesita algo como Continuaciones que permitan que las solicitudes de cometas se reanuden cuando se observe el evento que los desencadenó. AFAIK, esto no es algo que sea posible en PHP. Solo lo he visto en Java: consulte el servidor Apache Tomcat .
Editar:
Aquí hay un artículo sobre el uso de un equilibrador de carga ( HAProxy ) para permitirle ejecutar tanto un servidor apache como un servidor habilitado para cometas (por ejemplo, jetty, tomcat para Java) en el puerto 80 del mismo servidor.
fuente
Puede usar Nginx y JavaScript para implementar un sistema de chat basado en Comet que es muy escalable con poca memoria o uso de CPU.
Aquí tengo un ejemplo muy simple que puede ayudarlo 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/
fuente
PHP
Encontré estos pequeños screencasts divertidos que explican un cometa simple. Como nota al margen, realmente creo que esto matará su servidor con cualquier carga real. Cuando solo tenga un par de usuarios, diría que elija esta solución. Esta solución es realmente simple de implementar (los screencasts solo toman 5 minutos de su tiempo :)). Pero como estaba diciendo anteriormente, no creo que sea bueno para muchos usuarios concurrentes (supongo que debería compararlo;)) porque:
filemtime()
,Alternativas
Realmente creo que deberías probar las alternativas si quieres hacer una encuesta cometa / larga. Podrías usar muchos idiomas como, por ejemplo:
Simplemente realizando una simple búsqueda en Google, le mostrará muchas alternativas también PHP (que creo que en cualquier gran carga matará su servidor).
fuente
mod_php no es la única forma de usar PHP. Puede utilizar fastcgi. PHP debe estar compilado con
--enable-fastcgi
.PHP como FastCGI: http://www.fastcgi.com/drupal/node/5?q=node/10
fuente
También puede probar https://github.com/reactphp/react
El ejemplo introductorio muestra un servidor HTTP simple que escucha en el puerto 1337:
<?php $i = 0; $app = function ($request, $response) use (&$i) { $i++; $text = "This is request number $i.\n"; $headers = array('Content-Type' => 'text/plain'); $response->writeHead(200, $headers); $response->end($text); }; $loop = React\EventLoop\Factory::create(); $socket = new React\Socket\Server($loop); $http = new React\Http\Server($socket); $http->on('request', $app); $socket->listen(1337); $loop->run();
fuente
Tengo un problema similar. Una opción que encuentro interesante es utilizar un servidor Comet existente, como cometd-java o cometd-python, como centro de mensajes principal. Su código PHP es solo un cliente para el servidor Comet: puede publicar o leer mensajes de canales, al igual que otros clientes.
Hay un fragmento de código interesante vinculado aquí: http://morglog.org/?p=22=1 que implementa parte de este método (aunque también hay fragmentos de código de depuración repartidos).
fuente
Actualmente estoy implementando un servidor PHP Comet escalable usando funciones de socket. Se llama 'phet' ([ph] p com [et])
Página del proyecto: http://github.com/Tim-Smart/phet
Gratis gratis para participar en el desarrollo. Actualmente he logrado completar la mayor parte de la lógica del servidor, solo necesito terminar con las cosas del lado del cliente.
EDITAR: Capacidades de 'multiproceso' recientemente agregadas usando el
pcntl_fork
método :)fuente
Te resultará difícil implementar cometa en PHP, solo por su carácter inherente de un solo subproceso.
Eche un vistazo a Websync On-Demand : el servicio le permite integrar PHP a través de la publicación del lado del servidor, descargando las pesadas conexiones concurrentes y le permitirá crear una aplicación de chat en tiempo real en poco tiempo.
fuente
Acaba de salir un nuevo módulo para el servidor web nginx que permitirá Comet con cualquier idioma, incluido PHP.
http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/
fuente
Tendrá que crear su propio servidor en PHP. El uso de Apache / mod_php o incluso fastcgi no se escalará en absoluto. Tiene algunos años, pero puede ayudarlo a comenzar:
Servidor PHP-Comet: http://sourceforge.net/projects/comet/
fuente
Creo que esto es más un problema que tener muchos hilos apache ejecutándose todo el tiempo es un problema. Eso existirá con cualquier lenguaje si funciona a través de Apache de la misma manera que PHP (generalmente).
fuente