Cosa sono i polling lunghi, i websocket, gli eventi inviati dal server (SSE) e le comete?


1048

Ho provato a leggere alcuni articoli, ma non sono ancora molto chiaro sui concetti.

Qualcuno vorrebbe provare a spiegarmi quali sono queste tecnologie:

  1. Polling lungo
  2. Eventi inviati dal server
  3. WebSockets
  4. Cometa

Una cosa che mi sono imbattuto ogni volta è stato che il server mantiene aperta una connessione e invia i dati al client. Come viene mantenuta aperta la connessione e in che modo il client ottiene i dati inviati? (In che modo il client utilizza i dati, forse un po 'di codice potrebbe aiutare?)

Ora, quale di questi dovrei usare per un'app in tempo reale. Ho sentito molto parlare di websocket (con socket.io [una libreria node.js]) ma perché non PHP?


1
Websocket o webrtc in tempo reale? Esiste una libreria per websocket in php, è necessario scrivere un codice aggiuntivo affinché funzioni con ZMQ o semplicemente programmando socket, nodeJs è costruito per questo, quindi è facilmente disponibile. Il motivo per cui websocket non è prontamente disponibile in php è che devi eseguire un terminale aggiuntivo e tenerlo in esecuzione in modo che il server websocket sia prontamente disponibile, avrai due profitti di server. e la struttura, php non è una struttura di eventi come javascript, quindi c'è websocket che usa una struttura di eventi per catturare e inviare messaggi.
PauAI,

Inoltre: Comet e ServerSent Events sono la soluzione alternativa di PHP per ottenere quasi in tempo reale (non proprio) senza creare 2 server.
PauAI,

Risposte:


2077

Negli esempi seguenti il ​​client è il browser e il server è il server Web che ospita il sito Web.

Prima di poter comprendere queste tecnologie, è necessario innanzitutto comprendere il classico traffico Web HTTP.

HTTP normale:

  1. Un client richiede una pagina Web da un server.
  2. Il server calcola la risposta
  3. Il server invia la risposta al client.

HTTP

Polling Ajax:

  1. Un client richiede una pagina Web da un server utilizzando HTTP normale (vedi HTTP sopra).
  2. Il client riceve la pagina Web richiesta ed esegue JavaScript sulla pagina che richiede un file dal server a intervalli regolari (ad es. 0,5 secondi).
  3. Il server calcola ogni risposta e la rispedisce, proprio come il normale traffico HTTP.

Polling Ajax

Ajax Polling lungo:

  1. Un client richiede una pagina Web da un server utilizzando HTTP normale (vedi HTTP sopra).
  2. Il client riceve la pagina Web richiesta ed esegue il JavaScript sulla pagina che richiede un file dal server.
  3. Il server non risponde immediatamente con le informazioni richieste ma attende fino a quando non saranno disponibili nuove informazioni.
  4. Quando sono disponibili nuove informazioni, il server risponde con le nuove informazioni.
  5. Il client riceve le nuove informazioni e invia immediatamente un'altra richiesta al server, riavviando il processo.

Ajax Polling lungo

HTML5 Server Sent Events (SSE) / EventSource:

  1. Un client richiede una pagina Web da un server utilizzando HTTP normale (vedi HTTP sopra).
  2. Il client riceve la pagina Web richiesta ed esegue il JavaScript sulla pagina che apre una connessione al server.
  3. Il server invia un evento al client quando sono disponibili nuove informazioni.

HTML5 SSE

Websocket HTML5:

  1. Un client richiede una pagina Web da un server usando http regolare (vedi HTTP sopra).
  2. Il client riceve la pagina Web richiesta ed esegue il JavaScript sulla pagina che apre una connessione con il server.
  3. Il server e il client possono ora scambiarsi messaggi quando sono disponibili nuovi dati (su entrambi i lati).

    • Traffico in tempo reale dal server al client e dal client al server
    • Ti consigliamo di utilizzare un server che ha un ciclo di eventi
    • Con WebSocket è possibile connettersi con un server di un altro dominio.
    • È anche possibile utilizzare un websocket server ospitato da terze parti, ad esempio Pusher o altri . In questo modo dovrai solo implementare il lato client, il che è molto semplice!
    • Se vuoi leggere di più, ho trovato questi molto utili: ( articolo ), (articolo) ( tutorial ).

WebSocket HTML5

Cometa:

La cometa è una raccolta di tecniche precedenti a HTML5 che utilizzano streaming e polling prolungato per ottenere applicazioni in tempo reale. Maggiori informazioni su Wikipedia o su questo articolo.


Ora, quale di questi dovrei usare per un'app in tempo reale (che devo codificare). Ho sentito molto parlare di websocket (con socket.io [una libreria node.js]) ma perché non PHP?

Puoi usare PHP con WebSocket, dai un'occhiata a Ratchet .


21
Questo è bellissimo! Sto leggendo su SSE e ho trovato questo articolo, è molto bello - come ho ora confrontato cose, puoi anche includere SSE qui in modo che possiamo anche verificare la differenza con Websocket?
indice

1
@Tieme Oh è stato? Pensavo che SSE significasse Eventi inviati dal server. Comunque, grazie, lo vedo ora.
indice

1
D: in php supponiamo che tu stia usando websocket ogni client connesso al mio server usando ws: avrebbe un thread assegnato a lui / lei e la sua dimensione sarebbe ~ 2 MB come nel caso delle richieste normali? come sarebbe diverso in nodejs? Quanti client simultanei possono gestire nodejs e quando si interrompe cosa succede?
Muhammad Umer,

5
Puoi ottenere lo stesso risultato con entrambe le soluzioni, ma il meccanismo è diverso. Il polling lungo utilizza dati http "regolari", SSE utilizza un protocollo sottostante diverso e necessita di una configurazione del server diversa rispetto al polling lungo.
Tieme,

2
Bene, potresti usare apache se vuoi. Molte persone usano Node.js perché ha un ciclo di eventi. Ma per Apache, vedi stackoverflow.com/questions/12203443/…
Tieme

37

Tieme ha fatto molti sforzi nella sua eccellente risposta, ma penso che il nocciolo della questione dei PO sia come queste tecnologie si relazionano al PHP piuttosto che come ciascuna tecnologia funziona.

PHP è il linguaggio più utilizzato nello sviluppo web oltre all'ovvio lato client html, css e javascript. Tuttavia PHP ha 2 problemi principali quando si tratta di applicazioni in tempo reale:

1) PHP è iniziato come un CGI di base. PHP è progredito molto lontano dalla sua fase iniziale, ma è accaduto a piccoli passi. PHP aveva già molti milioni di utenti quando è diventata la libreria C incorporabile e flessibile che è oggi, la maggior parte dei quali dipendeva dal suo precedente modello di esecuzione, quindi non ha ancora fatto un solido tentativo di sfuggire al modello cgi internamente. Anche l'interfaccia a riga di comando richiama la libreria PHP (libphp5.so su Linux, php5ts.dll su Windows, ecc.) Come se fosse ancora un cgi che elabora una richiesta GET / POST. Esegue comunque il codice come se dovesse solo creare una "pagina" e quindi terminare il suo ciclo di vita. Di conseguenza, ha pochissimo supporto per la programmazione multi-thread o guidata dagli eventi (all'interno dello spazio utente di PHP), rendendolo attualmente poco pratico per applicazioni multiutente in tempo reale.

Nota che PHP ha estensioni per fornire loop di eventi (come libevent) e thread (come pthreads) nello spazio utenti di PHP, ma molto, molto, poche applicazioni li usano.

2) PHP ha ancora problemi significativi con la garbage collection. Sebbene questi problemi siano costantemente migliorati (probabilmente è il passo più importante per terminare il ciclo di vita come descritto sopra), anche i migliori tentativi di creare applicazioni PHP di lunga durata richiedono il riavvio su base regolare. Ciò lo rende anche poco pratico per le applicazioni in tempo reale.

PHP 7 sarà un grande passo per risolvere anche questi problemi e sembra molto promettente come piattaforma per applicazioni in tempo reale.


2
Una piccola correzione: PHP è sempre stato scritto in C, come si può vedere qui: museum.php.net/php1 Inoltre, "meno usato (ma immensamente più popolare)" è piuttosto contraddittorio; forse quello che vuoi dire è "più alla moda"?
IMSoP

@IMSoP - Grazie per la correzione, uso PHP da oltre un decennio e ho sempre avuto l'impressione che le sue radici fossero in Perl. La pagina della cronologia di PHP supporta chiaramente che era originariamente anche C. Modificherò la mia risposta una volta trovato un momento.
JSON,

Rimuoverò la parte su Perl poiché non si mescola bene con la documentazione ufficiale, ma questa è ancora un'area confusa nei primi sviluppi di PHP.
JSON,

PHP 7 sembra molto promettente come piattaforma per applicazioni in tempo reale? Quale miglioramento / cambiamento in PHP7 per applicazioni in tempo reale?
Tornerò il


9

Ho provato a prenderne nota e ho raccolto e scritto esempi da una prospettiva Java .

HTTP per sviluppatori Java

Reverse Ajax - Vecchio stile

Gestione asincrona sul lato server

Reverse Ajax - Nuovo stile

Eventi inviati dal server

Mettendolo qui per qualsiasi sviluppatore Java che sta esaminando lo stesso argomento.


la maggior parte di questi siti non funziona!
Alexander Dunn,

@AlexanderDunn grazie per averlo sollevato. Lo correggerò con collegamenti aggiornati
Giovanni,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.