Was sind Long-Polling, Websockets, Server-Sent Events (SSE) und Comet?

Ich habe versucht, einige Artikel zu lesen, aber ich bin mir über die Konzepte noch nicht ganz im Klaren.

Könnte jemand versuchen, mir zu erklären, was diese Technologien sind?

  1. Lange Abfrage
  2. Server-gesendete Ereignisse
  3. Websockets
  4. Comet

Eine Sache, auf die ich jedes Mal stieß, war, dass der Server eine Verbindung offen hält und Daten an den Client weiterleitet. Wie wird die Verbindung offen gehalten, und wie erhält der Client die übertragenen Daten? (Wie verwendet der Client die Daten, vielleicht könnte etwas Code helfen?)

Welches von beiden sollte ich nun für eine Echtzeit-Anwendung verwenden? Ich habe schon viel über Websockets gehört (mit socket.io [eine node.js-Bibliothek]), aber warum nicht PHP?

Lösung

*In den folgenden Beispielen ist der Client der Browser und der Server ist der Webserver, der die Website hostet.

Bevor Sie diese Technologien verstehen können, müssen Sie zunächst den klassischen HTTP-Webverkehr verstehen.

Reguläres HTTP:

  1. Ein Client fordert eine Webseite von einem Server an.
  2. Der Server berechnet die Antwort
  3. Der Server sendet die Antwort an den Client.

Ajax Polling:

  1. Ein Client fordert eine Webseite von einem Server mit normalem HTTP an (siehe HTTP oben).
  2. Der Client empfängt die angeforderte Webseite und führt das JavaScript auf der Seite aus, das in regelmäßigen Abständen (z. B. 0,5 Sekunden) eine Datei vom Server anfordert.
  3. Der Server berechnet jede Antwort und sendet sie zurück, genau wie beim normalen HTTP-Verkehr.

Ajax Polling

Ajax Long-Polling:

  1. Ein Client fordert eine Webseite von einem Server mit normalem HTTP an (siehe HTTP oben).
  2. Der Client empfängt die angeforderte Webseite und führt das JavaScript auf der Seite aus, das eine Datei vom Server anfordert.
  3. Der Server antwortet nicht sofort mit den angeforderten Informationen, sondern wartet, bis neue Informationen verfügbar sind.
  4. Wenn neue Informationen verfügbar sind, antwortet der Server mit den neuen Informationen.
  5. Der Client empfängt die neuen Informationen und sendet sofort eine weitere Anfrage an den Server, um den Prozess neu zu starten.

HTML5 Server Sent Events (SSE) / Ereignisquelle:

  1. Ein Client fordert eine Webseite von einem Server über normales HTTP an (siehe HTTP oben).
  2. Der Client empfängt die angeforderte Webseite und führt das JavaScript auf der Seite aus, das eine Verbindung zum Server öffnet.
  3. Der Server sendet ein Ereignis an den Client, wenn neue Informationen verfügbar sind.
  • Echtzeit-Verkehr vom Server zum Client, meistens ist es das, was Sie brauchen.
  • Sie werden einen Server verwenden wollen, der eine Ereignisschleife hat
  • Verbindungen mit Servern aus anderen Domänen sind nur möglich mit korrekten CORS-Einstellungen
  • Wenn Sie mehr lesen wollen, fand ich diese sehr nützlich: (Artikel), (Artikel), (Artikel), (Tutorial).

HTML5 Websockets:

  1. Ein Client fordert eine Webseite von einem Server über normales HTTP an (siehe HTTP oben).
  2. Der Client empfängt die angeforderte Webseite und führt das JavaScript auf der Seite aus, das eine Verbindung mit dem Server öffnet.
  3. Der Server und der Client können sich nun gegenseitig Nachrichten schicken, wenn neue Daten (auf beiden Seiten) verfügbar sind.
  • Echtzeitverkehr vom Server zum Client und vom Client zum Server
  • Sie werden einen Server verwenden wollen, der eine Ereignisschleife hat
  • Mit WebSockets ist es möglich, sich mit einem Server aus einer anderen Domäne zu verbinden.
  • Es ist auch möglich, einen gehosteten Websocket-Server eines Drittanbieters zu verwenden, zum Beispiel Pusher oder andere. Auf diese Weise müssen Sie nur die Client-Seite implementieren, was sehr einfach ist!
  • Wenn Sie mehr lesen wollen, finde ich diese sehr nützlich: (Artikel), (Artikel) (Tutorial).

Komet:

Comet ist eine Sammlung von Techniken aus der Zeit vor HTML5, die Streaming und Long-Polling nutzen, um Echtzeitanwendungen zu realisieren. Lesen Sie mehr auf wikipedia oder diesen Artikel.


Welche dieser Techniken sollte ich für eine Echtzeitanwendung verwenden (die ich programmieren muss)?

codieren). Ich habe schon viel über Websockets gehört (mit socket.io [eine node.js-Bibliothek]), aber warum nicht PHP?

Sie können PHP mit WebSockets verwenden, schauen Sie sich Ratchet an.

Kommentare (21)

Tieme hat sich viel Mühe mit seiner ausgezeichneten Antwort gegeben, aber ich denke, der Kern der Frage des Auftraggebers ist, wie sich diese Technologien auf PHP beziehen und nicht, wie jede einzelne Technologie funktioniert.

PHP ist die am häufigsten verwendete Sprache in der Webentwicklung, abgesehen von den offensichtlichen clientseitigen HTML-, CSS- und Javaskriptsprachen. Dennoch hat PHP 2 große Probleme, wenn es um Echtzeitanwendungen geht:

  1. PHP begann als ein sehr einfaches CGI. PHP hat sich seit seinen Anfängen sehr weit entwickelt, aber das geschah in kleinen Schritten. Als PHP zu der einbettbaren und flexiblen C-Bibliothek wurde, die es heute ist, hatte es bereits viele Millionen Benutzer, von denen die meisten auf das frühere Ausführungsmodell angewiesen waren, so dass es noch keinen soliden Versuch unternommen hat, dem CGI-Modell intern zu entkommen. Sogar die Kommandozeilenschnittstelle ruft die PHP-Bibliothek (libphp5.so unter Linux, php5ts.dll unter Windows, usw.) auf, als ob es immer noch ein cgi wäre, das eine GET/POST-Anfrage verarbeitet. Es führt immer noch Code aus, als ob es nur eine "Seite" aufbauen und dann seinen Lebenszyklus beenden müsste. Das Ergebnis ist, dass es sehr wenig Unterstützung für Multi-Thread- oder ereignisgesteuerte Programmierung (innerhalb des PHP-Benutzerraums) bietet, was es derzeit unpraktisch für Echtzeit-Mehrbenutzeranwendungen macht.

Beachten Sie, dass PHP zwar über Erweiterungen verfügt, um Ereignisschleifen (wie libevent) und Threads (wie pthreads) im PHP-Benutzerraum bereitzustellen, aber nur sehr, sehr wenige Anwendungen nutzen diese.

  1. PHP hat immer noch erhebliche Probleme mit der Garbage Collection. Obwohl sich diese Probleme ständig verbessert haben (wahrscheinlich ist es der größte Schritt, den Lebenszyklus wie oben beschrieben zu beenden), müssen selbst die besten Versuche, lang laufende PHP-Anwendungen zu erstellen, regelmäßig neu gestartet werden. Dies macht es auch für Echtzeitanwendungen unpraktisch.

PHP 7 wird ein großer Schritt sein, um auch diese Probleme zu beheben, und scheint als Plattform für Echtzeitanwendungen sehr vielversprechend.

Kommentare (8)

Ich habe versucht, diese zu notieren und habe Beispiele aus der Java-Perspektive gesammelt und geschrieben.

HTTP für Java-Entwickler

Reverse Ajax - Alter Stil

Async-Behandlung auf der Server-Seite

Reverse Ajax - Neuer Stil

Vom Server gesendete Ereignisse

Für alle Java-Entwickler, die sich mit demselben Thema beschäftigen, stelle ich es hier ein.

Kommentare (0)