¿Qué son Long-Polling, Websockets, Eventos enviados por el servidor (SSE) y Comet?

He intentado leer algunos artículos, pero aún no tengo muy claro los conceptos.

¿A alguien le gustaría probar a explicarme qué son estas tecnologías?

  1. Long Polling
  2. Eventos enviados por el servidor
  3. Websockets
  4. Cometa </​​li>

Una cosa que encontré cada vez 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 [a node.js library]) pero ¿por qué no PHP?

862
Además: Comet y ServerSent Events son la solución de PHP para lograr casi en tiempo real (no realmente) sin crear 2 servidores.
agregado el autor PauAI, fuente
Websoc en tiempo real o webrtc? Hay una biblioteca para websocket en PHP, es necesario escribir código adicional para que funcione con ZMQ o solo con la programación del socket, nodeJs está diseñado para esto, por lo que es fácilmente accesible. La razón por la que websocket no está disponible en PHP es que tienes que ejecutar un terminal adicional y mantenerlo en ejecución para que el servidor websocket esté disponible, tendrás dos servidores en la línea de fondo. y la estructura, PHP no es una estructura de eventos como javascript, así que hay eso, websocket usa una estructura de eventos par
agregado el autor PauAI, fuente

3 Respuestas

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 poder 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 </​​li>
  3. El servidor envía la respuesta al cliente.

HTTP

Ajax Polling:

  1. Un cliente solicita una página web desde un servidor usando HTTP normal (ver HTTP 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 (por ejemplo, 0,5 segundos).
  3. El servidor calcula cada respuesta y la envía de vuelta, al igual que el tráfico HTTP normal.

Ajax Polling

Ajax Long-Polling:

  1. Un cliente solicita una página web desde un servidor usando HTTP normal (ver HTTP 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 de inmediato 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 información nueva.
  5. El cliente recibe la nueva información e inmediatamente envía otra solicitud al servidor, reiniciando el proceso.

Ajax Long-Polling

Servidor HTML5 enviado eventos (SSE)/EventSource:

  1. A client requests a webpage from a server using regular HTTP (see HTTP above).
  2. The client receives the requested webpage and executes the JavaScript on the page which opens a connection to the server.
  3. The server sends an event to the client when there's new information available.

    • Real-time traffic from server to client, mostly that's what you'll need
    • You'll want to use a server that has an event loop
    • Not possible to connect with a server from another domain
    • If you want to read more, I found these very useful: (article), (article), (article), (tutorial).

HTML5 SSE

Websockets HTML5:

  1. A client requests a webpage from a server using regular http (see HTTP above).
  2. The client receives the requested webpage and executes the JavaScript on the page which opens a connection with the server.
  3. The server and the client can now send each other messages when new data (on either side) is available.

    • Real-time traffic from the server to the client and from the client to the server
    • You'll want to use a server that has an event loop
    • With WebSockets it is possible to connect with a server from another domain.
    • It is also possible to use a third party hosted websocket server, for example Pusher or others. This way you'll only have to implement the client side, which is very easy!
    • If you want to read more, I found these very useful: (article), (article) (tutorial).

HTML5 WebSockets

Cometa:

Comet es una colección de técnicas anteriores a HTML5 que usan transmisión y larga encuesta para lograr aplicaciones en tiempo real. Lea más en wikipedia o este artículo.


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

Puede usar PHP con WebSockets, revise Ratchet .

1840
agregado
¿Cuál es la diferencia real entre SSE y Websockets?
agregado el autor Basj, fuente
¿Por qué dices que no uses apache?
agregado el autor bobzer, fuente
No pude entender las diferencias de cometa </​​i> y ajax encuesta larga . En ambas técnicas, estamos (como cliente) enviando una solicitud ajax y esperando con una solicitud HTTP abierta para una respuesta del servidor. @Tieme
agregado el autor Eray, fuente
Q: en PHP digamos que estabas usando websocket, ¿cada cliente conectado a mi servidor usando ws: tendría un hilo asignado a él/ella y su tamaño sería ~ 2mb como es el caso con las peticiones normales? ¿Cómo difería eso en nodejs? ¿Cuántos clientes simultáneos puede manejar nodejs y cuándo se rompe lo que sucede?
agregado el autor Muhammad Umer, fuente
@Tieme Oh fue eso? Pensé que SSE se refería a Eventos enviados por el servidor. De todos modos, gracias, lo veo ahora.
agregado el autor index, fuente
¡Esto es asombroso! Estoy leyendo sobre SSE y encontré este artículo, es muy bueno, como que ahora he comparado cosas, ¿también puede incluir SSE aquí para que podamos verificar su diferencia con Websocket?
agregado el autor index, fuente
@Tieme ¿Cuál será el mejor método para recuperar datos como cliente para usuarios de Android del servidor de socket web?
agregado el autor Apple Appala, fuente
Sería bueno si esta respuesta fuera más explícita sobre la tecnología subyacente. ¿Qué conexiones TCP se usan? ¿Se establecen las segundas conexiones sobre la primera utilizada para hacer la solicitud original? ¿Cómo está involucrado el pipeline HTTP?
agregado el autor Charlie, fuente
Puede lograr lo mismo con ambas soluciones, pero el mecanismo es diferente. Long-polling usa datos http 'regulares', SSE utiliza un protocolo subyacente diferente y necesita una configuración de servidor diferente en comparación con el sondeo largo.
agregado el autor Tieme, fuente
@Eray, ¿leíste el último párrafo y seguiste las URL para obtener más información sobre el cometa?
agregado el autor Tieme, fuente
Bueno, podrías usar apache si quieres. Pero mucha gente usa Node.js porque tiene un bucle de eventos. Pero para Apache, consulte PHP para sockets web disponible% 2312204603 "> stackoverflow.com/questions/12203443/…
agregado el autor Tieme, fuente
Estoy de acuerdo, ¿tienes este conocimiento o conoces a un usuario que lo hace?
agregado el autor Tieme, fuente
Creo que debería ser: "el cliente ejecuta JavaScript en la página", así que este es el navegador, no el servidor. ¿Claro?
agregado el autor Tieme, fuente
lo has clavado ... respuesta increíble
agregado el autor kunal, fuente
¿Puede sugerirme cuál será el protocolo de Comet para Spring MVC?
agregado el autor Yasir Shabbir Choudhary, fuente
@Tieme ¿cuál es la diferencia entre SSE y long pulling? Por tus palabras, son casi lo mismo.
agregado el autor tomwang1013, fuente
Solo para agregar a lo que @Tieme ya ha respondido, las limitaciones de SSE y WS se pueden manejar de la siguiente manera: El problema de reconexión WS se puede resolver utilizando una biblioteca cliente adecuada, por ejemplo awesome-websocket . El problema del servidor de origen cruzado de SSE se puede resolver con enviando CORS encabezados en la respuest
agregado el autor Piyush Kansal, fuente
Supongo que Long Polling (y probablemente cometa también) estará limitado por la infraestructura de red que impone un corto tiempo de espera en HTTP.
agregado el autor Ced, fuente
@Tieme Estaba perdido con tu explicación en el punto en el que estabas explicando sobre Ajax Polling y dijiste "Un cliente solicita una página web desde un servidor usando HTTP normal (ver HTTP arriba) y luego La página web solicitada ejecuta JavaScript ... "¿Cómo funciona un servidor web normal (por ejemplo, apache)" ejecuta JavaScript "?
agregado el autor Olowookere Emmanuel, fuente

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 lado obvio 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 mucho desde su primera etapa, pero sucedió en pequeños pasos. PHP ya tenía muchos millones de usuarios en el momento en que se convirtió en la biblioteca C incrustable 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 línea de comandos invoca la biblioteca de PHP (libphp5.so en linux, php5ts.dll en Windows, etc.) como si todavía fuera un cgi que procesa una solicitud GET/POST. Todavía ejecuta el 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 multihilo o basada en eventos (dentro del espacio de usuario PHP), lo que hace que actualmente no sea práctico para aplicaciones multiusuario en tiempo real.

Tenga en cuenta que PHP tiene extensiones para proporcionar bucles de eventos (como libevent) e hilos (como pthreads) en el espacio de usuario de PHP, pero muy, muy pocas de las aplicaciones los usan.

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 describió anteriormente), incluso los mejores intentos para crear aplicaciones PHP de larga ejecución requieren reiniciarse regularmente. Esto también lo hace poco práctico para aplicaciones en tiempo real.

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

31
agregado
PHP 7 parece muy prometedor como una plataforma para aplicaciones en tiempo real? ¿Qué mejora/cambio en PHP7 para aplicaciones en tiempo real?
agregado el autor I'll-Be-Back, fuente
Una pequeña corrección: PHP siempre se escribió en C, como se puede ver aquí: museum.php.net/php1 Además, "menos usado (pero inmensamente más popular)" es bastante autocontradictorio; tal vez lo que quieres decir es "más de moda"?
agregado el autor IMSoP, fuente
aunque también svn.php. net/viewvc/phpdoc/es/trunk/appendices/& hellip; && PHP "rel =" nofollow noreferrer "> web.archive.org/web/20090426061624/http://us3.php.net/…
agregado el autor eis, fuente
agregado el autor eis, fuente
@I'll-Be-Back - gestión de memoria fija/recolección de basura, compilación JIT, etc.
agregado el autor JSON, fuente
Eliminaré el bit sobre Perl ya que no se combina bien con la documentación oficial, pero este sigue siendo un área confusa en el desarrollo inicial de PHP.
agregado el autor JSON, fuente
@IMSoP - Gracias por la corrección, he estado usando PHP durante más de una década y siempre he tenido la impresión de que sus raíces estaban en Perl. La página historia de PHP confirma claramente que originalmente también era C. Editaré mi respuesta una vez que encuentre un momento.
agregado el autor JSON, fuente
Por favor edite su respuesta con respecto a las raíces de php.
agregado el autor Netverse, fuente

Intenté tomar nota de esto y recopilé y escribí ejemplos desde una perspectiva de Java .

HTTP for Java Developers

Invertir Ajax - Estilo anterior

Async Handling en el servidor

Reverse Ajax - Nuevo estilo

Eventos enviados por el servidor

Poniéndolo aquí para cualquier desarrollador de Java que esté investigando el mismo tema.

7
agregado
Todos los enlaces están muertos ahora
agregado el autor SpringLearner, fuente
@ SpringLearner gracias por anotarlo. He actualizado los enlaces
agregado el autor John, fuente
PHP - Comunidad española
PHP - Comunidad española
9 de los participantes

Enlace para invitaciones: https://t.me/joinchat/B2gdShUFvCner-RgqRF43A En este grupo hablamos de PHP. Partner: es.switch-case.com