2010-12-21 11 views
7

Me he estado preguntando cómo hacer una transmisión de datos "real" (semi) en tiempo real con PHP.¿El mejor enfoque para la transmisión de datos en tiempo real (multiplataforma) en PHP?

aplicaciones posibles: habitaciones, subastas, juegos, etc.

Por "verdadero" chat, me refiero a los datos no se acaba de escribir en alguna parte y sondea de forma continua, pero en realidad el streaming al cliente de alguna manera.

Por "semi", quiero decir que está bien si solo el flujo del servidor al cliente es en tiempo real, y los mensajes del cliente al servidor no.

Para la comunicación entre el cliente y el servidor, me gustaría seguir con HTTP simple (AJAX) en lugar de algún otro protocolo.

La transmisión al cliente con HTTP es posible al enjuagar manualmente el búfer de salida.

La pregunta es a qué conectar esa secuencia de comandos en el lado del servidor?

Y una vez que está conectado, para hacer una lectura de bloqueo, en lugar de buscar cambios.

La extensión de memoria compartida (shmop) funcionaría, pero no es multiplataforma.

Quizás memcached podría funcionar? Pero no estoy seguro de si hay una forma de hacer una lectura de bloqueo, por lo que se reduce a sondear de nuevo, aunque estoy seguro de que la memcached es bastante rápida, simplemente no me gusta la idea de un sondeo continuo.

¿Alguna idea?

+0

no me refiero push - Estoy buscando alguna manera de abrir una secuencia/tubería/puerto/canal/algo en el lado del servidor y escribir en él, y cualquier otro script actualmente conectado a ese flujo/cosa puede leer de él en modo de bloqueo, y luego escribir los resultados en una solicitud HTTP que se ejecuta continuamente y vaciar. –

Respuesta

5

PHP no es muy adecuado para la aplicación de flujo de datos en tiempo real. PHP es muy lento y no está diseñado para crear aplicaciones de subprocesos múltiples. Sería mejor implementar un servidor de socket completo en un lenguaje como Python o Java.

Dicho esto, recomendaría altamente el registro de salida NodeJS: http://nodejs.org/

Se utiliza un modelo basado en eventos asíncronos para I/O, en lugar de tener hilos bloquean en un bucle de eventos. Los servidores de NodeJS están escritos en Javascript. NodeJS es rápido, escalas y tiene una curva de aprendizaje baja.

Los clientes se conectarían a un servidor HTTP NodeJS utilizando largas consultas de solicitudes Ajax. PHP podría conectarse a NodeJS directamente y enviar notificaciones. O PHP podría escribir en una cola de mensajes, en una base de datos, en una memoria de memoria, etc., y NodeJS sondearía esas tiendas de datos en busca de actualizaciones y enviaría nuevos mensajes a los clientes.

Es posible que necesite escribir su propio daemon para servir como un intermediario entre NodeJS a MySQL, memcached, etc. al sondear las actualizaciones. NodeJS mantendría un socket abierto con un proceso de daemon. El proceso del daemon sondearía los almacenes de datos en busca de actualizaciones y enviaría las actualizaciones a NodeJS. Un servidor HTTP NodeJS luego enviará esas actualizaciones a los clientes.

Ver este tutorial para implementar un flujo en tiempo real Twitter: http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/

+1

esto es exactamente lo que node.js es para – JohnO

+6

. Se equivoca al decir que PHP es lento. Pero tengo que estar de acuerdo, probablemente no fue diseñado para aplicaciones paralelas/multihilo de este tipo. Respuesta aceptada –

+0

nodejs tiene un solo subproceso y no escala –

2

Si está utilizando HTML y Javascript, entonces desea WebSockets. Si es Flash o cualquier otra cosa, entonces tomas TCP normales.

La idea de cualquiera de las dos es ejecutar un archivo de servidor (escrito en PHP), que espera conexiones. Una vez que está conectado a uno o más clientes, los datos se pueden presionar en ambos sentidos. Hay algunos proyectos PHP WebSocket por ahí. Echa un vistazo a esto:

http://code.google.com/p/phpwebsocket

También hay un marco llamado esqueleto que he estado contribuyendo a que se ha construido una biblioteca de servidor de WebSocket en todavía en las etapas inestables, sin embargo..

http://code.google.com/p/skeleton

Desafortunadamente, WebSockets son todavía una nueva tecnología, así que no son compatibles universalmente. Como mencionó @Christian, es posible que desee utilizar la biblioteca Socket.IO.

+1

Recientemente encontré [Ratchet] (https://github.com/cboden/Ratchet) - una implementación muy agradable, limpia y simple de un servidor web-sockets en PHP. –

+2

Retiro eso: Ratchet es una buena idea, pero PHP como tal no es adecuado para aplicaciones en tiempo real como un servidor de socket - [este artículo] (http://software-gunslinger.tumblr.com/post/47131406821/php) -is-meant-to-die) explica por qué. –

0

Si desea comunicarse entre PHP y otro idioma (por ejemplo, una aplicación C++) es posible que desee consultar Apache Thrift (http://thrift.apache.org/). Apache Thrift es ampliamente utilizado en Facebook para "desarrollo de servicios escalables de idiomas cruzados".

Editar: Probablemente usaría Apache Thrift para comunicarme con una aplicación Twisted escuchando en el puerto 80 y los navegadores se conectarían a la aplicación Twisted utilizando una encuesta larga o una conexión web. Es posible que también desee ver en Socket.IO, es una implementación de socket web multiproveedor que está hecho para aplicaciones en tiempo real.

Básicamente, tendría su aplicación presionada a su servidor web Twisted usando Thrift y luego pasaría el mensaje a cualquier conexión abierta.

  • Cristiano
+0

No estoy convencido de que valga la pena el esfuerzo: PHP simplemente no fue diseñado para este tipo de tarea. Fue diseñado con el ciclo de vida HTTP en mente: un modelo de solicitud/respuesta sin estado. NodeJS es una apuesta mucho más segura para aplicaciones de socket/en tiempo real, y la barrera del idioma no es tan mala ahora, con todos los grandes lenguajes que compilan a JavaScript y simplemente usan Node/V8 como VM. –

Cuestiones relacionadas