¿Qué son Long-Polling, Websockets, Server-Sent Events (SSE) y Comet?
He intentado leer algunos artículos, pero todavía no tengo muy claros los conceptos.
¿A alguien le gustaría intentar explicarme cuáles son estas tecnologías?
- Sondeo largo
- Eventos enviados por el servidor
- enchufes web
- Cometa
Una cosa con la que me encontré 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? ¿Quizás algún código pueda ayudar?)
Ahora, ¿cuál de ellos debería usar para una aplicación en tiempo real? He oído mucho sobre websockets (con socket.io [una biblioteca node.js]), pero ¿por qué no PHP?
En los ejemplos siguientes, el cliente es el navegador y el servidor es el servidor web que aloja el sitio web.
Antes de poder comprender estas tecnologías, primero debe comprender el tráfico web HTTP clásico .
HTTP normal:
- Un cliente solicita una página web a un servidor.
- El servidor calcula la respuesta.
- El servidor envía la respuesta al cliente.
Encuesta Ajax:
- Un cliente solicita una página web desde un servidor utilizando HTTP normal (consulte HTTP arriba).
- El cliente recibe la página web solicitada y ejecuta JavaScript en la página que solicita un archivo del servidor a intervalos regulares (por ejemplo, 0,5 segundos).
- El servidor calcula cada respuesta y la devuelve, como el tráfico HTTP normal.
Encuesta larga de Ajax:
- Un cliente solicita una página web desde un servidor utilizando HTTP normal (consulte HTTP arriba).
- El cliente recibe la página web solicitada y ejecuta JavaScript en la página que solicita un archivo del servidor.
- El servidor no responde inmediatamente con la información solicitada, sino que espera hasta que haya nueva información disponible.
- Cuando hay nueva información disponible, el servidor responde con la nueva información.
- El cliente recibe la nueva información e inmediatamente envía otra solicitud al servidor, reiniciando el proceso.
Eventos enviados por el servidor HTML5 (SSE)/EventSource:
- Un cliente solicita una página web desde un servidor utilizando HTTP normal (consulte HTTP arriba).
- El cliente recibe la página web solicitada y ejecuta JavaScript en la página que abre una conexión con el servidor.
El servidor envía un evento al cliente cuando hay nueva información disponible.
- Tráfico en tiempo real del servidor al cliente, principalmente eso es lo que necesitará
- Querrás usar un servidor que tenga un bucle de eventos.
- Las conexiones con servidores de otros dominios solo son posibles con la configuración CORS correcta
- Si quieres leer más, estos me resultaron muy útiles: (artículo) , (artículo) , (artículo) , (tutorial) .
Conectores web HTML5:
- Un cliente solicita una página web desde un servidor utilizando http normal (consulte HTTP arriba).
- El cliente recibe la página web solicitada y ejecuta JavaScript en la página que abre una conexión con el servidor.
El servidor y el cliente ahora pueden enviarse mensajes entre sí cuando haya nuevos datos disponibles (en ambos lados).
- 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 otros . De esta manera sólo tendrás que implementar el lado del cliente, ¡lo cual es muy fácil!
- Si quieres leer más, estos me resultaron muy útiles: ( artículo ), (artículo) ( tutorial ).
Cometa:
Comet es una colección de técnicas anteriores a HTML5 que utilizan streaming y sondeo prolongado para lograr aplicaciones en tiempo real. Lea más en wikipedia o en este artículo.
Ahora, ¿cuál de ellos debería usar para una aplicación en tiempo real (que necesito codificar)? He oído mucho sobre websockets (con socket.io [una biblioteca node.js]), pero ¿por qué no PHP?
Puedes usar PHP con WebSockets, consulta Ratchet .
Tieme se esforzó mucho en su excelente respuesta, pero creo que el núcleo de la pregunta del OP es cómo se relacionan estas tecnologías 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 HTML, CSS y Javascript del lado obvio del cliente. Sin embargo, PHP tiene dos problemas importantes cuando se trata de aplicaciones en tiempo real:
- PHP comenzó como un CGI muy básico. PHP ha progresado mucho desde su etapa inicial, pero ha ocurrido en pequeños pasos. PHP ya tenía muchos millones de usuarios cuando se convirtió en la biblioteca C flexible e integrable que es hoy, 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 de la Modelo CGI internamente. Incluso la interfaz de línea de comandos invoca la biblioteca PHP (
libphp5.so
en Linux,php5ts.dll
Windows, etc.) como si todavía fuera un CGI procesando una solicitud GET/POST. Todavía ejecuta código como si solo tuviera que crear una "página" y luego finalizar su ciclo de vida. Como resultado, tiene muy poco soporte para programación multiproceso o basada en eventos (dentro del espacio de usuario de PHP), lo que actualmente lo hace poco 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.
- PHP todavía tiene problemas importantes con la recolección de basura. Aunque estos problemas han ido mejorando constantemente (probablemente su mayor paso para finalizar el ciclo de vida como se describe anteriormente), incluso los mejores intentos de crear aplicaciones PHP de larga duración requieren reiniciarse periódicamente. 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.
Votación
Básicamente, el sondeo es una técnica que consiste en solicitar información del servidor después de intervalos regulares. Esta conexión se produce siguiendo el protocolo HTTP. Hay dos tipos de encuestas:
- Encuesta corta
- Sondeo largo
Encuesta corta
En una encuesta breve, el cliente solicita información al servidor. El servidor procesa la solicitud. Si hay datos disponibles para la solicitud, el servidor responde a la solicitud con la información requerida. Sin embargo, si el servidor no tiene datos disponibles para el cliente, el servidor devuelve una respuesta vacía. En ambas situaciones, la conexión se cerrará después de devolver la respuesta. Los clientes siguen emitiendo nuevas solicitudes incluso después de que el servidor envía respuestas vacías. Este mecanismo aumenta el costo de la red en el servidor.
Sondeo largo
En un sondeo largo, los clientes pueden solicitar información del servidor con la expectativa de que el servidor no responda de inmediato. Cuando el servidor recibe la solicitud, si no tiene datos nuevos para el cliente, en lugar de devolver una respuesta vacía, el servidor mantiene la solicitud abierta y espera a que lleguen los datos. Cuando el servidor recibe nuevos datos, entrega la respuesta al cliente de inmediato, completando la solicitud abierta. Luego, el cliente puede enviar otra solicitud de nuevas actualizaciones después de recibir la respuesta del servidor. Las encuestas largas reducen los costos al reducir la cantidad de respuestas vacías.
WebSocket
WebSocket es un protocolo que proporciona canales de comunicación bidireccionales (bidireccionales) a través de una única conexión TCP. Websocket facilita una conexión persistente entre un cliente y un servidor, permitiendo que ambas partes comiencen a transferir datos en cualquier momento. El protocolo de enlace WebSocket es el procedimiento mediante el cual el cliente crea una conexión WebSocket. Si la operación tiene éxito, el servidor y el cliente pueden enviar y recibir datos en cualquier momento. Se utiliza principalmente en aplicaciones web en tiempo real como WhatsApp, Uber.
Evento enviado por el servidor (SSE)
A diferencia de WebSockets, no podemos emitir solicitudes de un cliente a un servidor mediante SSE ya que es una conexión unidireccional. Cuando necesitamos una transmisión "casi en tiempo real" desde el servidor al cliente, o si el servidor genera datos en un bucle, SSE es la opción ideal.
Cometa
Comet es un paradigma de diseño de aplicaciones web que describe una interacción bidireccional continua entre un servidor y un navegador web utilizando métodos HTTP nativos. Cometa es un término general. Ajax Push, HTTP Streaming y HTTP Server Push son algunos de los mecanismos HTTP que pueden usarse para proporcionar esta interacción basada en eventos.
Puede utilizar fácilmente Node.JS en su aplicación web solo para comunicación en tiempo real. Node.JS es realmente poderoso cuando se trata de WebSockets. Por lo tanto, "Notificaciones PHP a través de Node.js" sería un gran concepto.
Vea este ejemplo: Creación de una aplicación de chat en tiempo real con PHP y Node.js