php websocket comet long-polling server-sent-events

php - ¿Qué son los sondeos largos, websockets, eventos enviados por el servidor(SSE) y cometas?



long-polling server-sent-events (3)

He intentado leer algunos artículos, pero todavía no tengo muy claros los conceptos.

¿Alguien quisiera intentar explicarme qué son estas tecnologías?

  1. Sondeo largo
  2. Eventos enviados por el servidor
  3. Websockets
  4. Cometa

Una cosa con la que me topé siempre fue que el servidor mantiene una conexión abierta y envía datos al cliente. ¿Cómo se mantiene abierta la conexión y cómo obtiene el cliente los datos enviados? (¿Cómo utiliza el cliente los datos, tal vez algún código podría ayudar?)

Ahora, cuál de ellos debería usar para una aplicación en tiempo real. He estado escuchando mucho sobre websockets (con socket.io [una biblioteca node.js]) pero ¿por qué no PHP?



Tieme puso mucho esfuerzo en su excelente respuesta, pero creo que el núcleo de la pregunta de OP es cómo estas tecnologías se relacionan con PHP en lugar de cómo funciona cada tecnología.

PHP es el lenguaje más utilizado en el desarrollo web, además del obvio lado del cliente html, css y javascript. Sin embargo, PHP tiene 2 problemas principales cuando se trata de aplicaciones en tiempo real:

1) PHP comenzó como un CGI muy básico. PHP ha progresado muy lejos desde su etapa inicial, pero sucedió en pequeños pasos. PHP ya tenía muchos millones de usuarios en el momento en que se convirtió en la biblioteca de C incrustada y flexible que es hoy en día, la mayoría de los cuales dependían de su modelo de ejecución anterior, por lo que aún no ha hecho un intento sólido de escapar del modelo cgi internamente. Incluso la interfaz de la línea de comandos invoca la biblioteca PHP (libphp5.so en linux, php5ts.dll en windows, etc.) como si aún fuera un cgi procesando una solicitud GET / POST. Todavía ejecuta el código como si solo tuviera que construir una "página" y luego finalizar su ciclo de vida. Como resultado, tiene muy poco soporte para la programación de múltiples subprocesos o eventos (dentro del espacio de usuario de PHP), por lo que actualmente no es práctico para aplicaciones multiusuario en tiempo real.

Tenga en cuenta que PHP tiene extensiones para proporcionar bucles de eventos (como libevent) y subprocesos (como pthreads) en el espacio de usuario de PHP, pero muy, muy pocas aplicaciones los utilizan.

2) PHP todavía tiene problemas importantes con la recolección de basura. Aunque estos problemas han mejorado constantemente (es probable que sea el mejor paso para finalizar el ciclo de vida como se describe anteriormente), incluso los mejores intentos de crear aplicaciones PHP de ejecución prolongada requieren que se reinicien de forma regular. Esto también lo hace poco práctico para aplicaciones en tiempo real.

PHP 7 también será un gran paso para solucionar estos problemas, y parece muy prometedor como plataforma para aplicaciones en tiempo real.


En los ejemplos a continuación, el cliente es el navegador y el servidor es el servidor web que aloja el sitio web.

Antes de que pueda comprender estas tecnologías, primero debe comprender el tráfico web HTTP clásico .

HTTP regular:

  1. Un cliente solicita una página web desde un servidor.
  2. El servidor calcula la respuesta.
  3. El servidor envía la respuesta al cliente.

Ajax Polling:

  1. Un cliente solicita una página web de un servidor utilizando HTTP normal (consulte HTTP más arriba).
  2. El cliente recibe la página web solicitada y ejecuta el JavaScript en la página que solicita un archivo del servidor a intervalos regulares (p. Ej., 0,5 segundos).
  3. El servidor calcula cada respuesta y la envía de vuelta, al igual que el tráfico HTTP normal.

Ajax de larga votación:

  1. Un cliente solicita una página web de un servidor utilizando HTTP normal (consulte HTTP más arriba).
  2. El cliente recibe la página web solicitada y ejecuta el JavaScript en la página que solicita un archivo del servidor.
  3. El servidor no responde inmediatamente con la información solicitada, pero espera hasta que haya nueva información disponible.
  4. Cuando hay nueva información disponible, el servidor responde con la nueva información.
  5. El cliente recibe la nueva información e inmediatamente envía otra solicitud al servidor, reiniciando el proceso.

HTML5 Server Enviado Eventos (SSE) / EventSource:

  1. Un cliente solicita una página web de un servidor utilizando HTTP normal (consulte HTTP más arriba).
  2. El cliente recibe la página web solicitada y ejecuta el JavaScript en la página que abre una conexión con el servidor.
  3. El servidor envía un evento al cliente cuando hay nueva información disponible.

    • Tráfico en tiempo real de servidor a cliente, principalmente eso es lo que necesitará
    • Querrás usar un servidor que tenga un bucle de eventos
    • No es posible conectar con un servidor de otro dominio
    • Si quieres leer más, me parecen muy útiles: (article) , (article) , (article) , (tutorial) .

HTML5 Websockets:

  1. Un cliente solicita una página web de un servidor utilizando http regular (consulte HTTP más arriba).
  2. El cliente recibe la página web solicitada y ejecuta el JavaScript en la página que abre una conexión con el servidor.
  3. Ahora, el servidor y el cliente pueden enviarse mensajes cuando haya nuevos datos (de cualquier lado) disponibles.

    • Tráfico en tiempo real del servidor al cliente y del cliente al servidor
    • Querrás usar un servidor que tenga un bucle de eventos
    • Con WebSockets es posible conectarse con un servidor de otro dominio.
    • También es posible utilizar un servidor websocket alojado por un tercero, por ejemplo, Pusher u others . De esta manera solo tendrás que implementar el lado del cliente, ¡lo cual es muy fácil!
    • Si quieres leer más, me parecen muy útiles: ( article ), (article) ( tutorial ).

Cometa:

Comet es una colección de técnicas anteriores a HTML5 que utilizan la transmisión y el sondeo largo para lograr aplicaciones en tiempo real. Lea más en wikipedia o en this artículo.

Ahora, cuál de ellos debería usar para una aplicación en tiempo real (que debo codificar). He estado escuchando mucho sobre websockets (con socket.io [una biblioteca node.js]) pero ¿por qué no PHP?

Puedes usar PHP con WebSockets, echa un vistazo a Ratchet .