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

Ich habe versucht, einige Artikel zu lesen, aber ich bin noch nicht sehr klar in Bezug auf die Konzepte.

Möchte jemand gerne erklären, was diese Technologien sind:

  1. Langes Polling
  2. Server-gesendete Ereignisse
  3. Websockets
  4. Komet

Eine Sache, auf die ich jedes Mal stieß, war, dass der Server eine Verbindung offen hält und Daten an den Client sendet. Wie bleibt die Verbindung offen und wie bekommt der Client die Push-Daten? (Wie benutzt der Kunde die Daten, vielleicht hilft etwas Code?)

Nun, welchen sollte ich für eine Echtzeit-App verwenden? Ich habe viel über Websockets gehört (mit socket.io [eine node.js-Bibliothek]), aber warum nicht PHP?

862
hinzugefügt bearbeitet
Ansichten: 1
Außerdem: Comet und ServerSent Events sind PHPs Workaround, mit dem man fast in Echtzeit (ohne wirklich) 2 Server erstellen kann.
hinzugefügt der Autor PauAI, Quelle
Echtzeit Websocket oder webrtc? Es gibt eine Bibliothek für WebSocket in PHP, müssen Sie extra Code schreiben, damit es mit ZMQ oder nur Socket-Programmierung funktioniert, NodeJs ist dafür gebaut, so dass es leicht verfügbar ist. Der Grund, warum WebSocket in PHP nicht ohne weiteres verfügbar ist, ist, dass Sie ein zusätzliches Terminal ausführen müssen und es so laufen lässt, dass der Websocket-Server ohne weiteres verfügbar ist. und die struktur, PHP ist keine ereignisstruktur wie javascript, also gibt es das, websocket verwendet eine ereignisstruktur, um nachrichten zu erfassen und zu send
hinzugefügt der Autor PauAI, Quelle

3 Antworten

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-Web-Datenverkehr 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.

HTTP

Ajax-Umfrage:

  1. Ein Client fordert eine Webseite von einem Server an, der reguläres HTTP verwendet (siehe HTTP oben).
  2. Der Client empfängt die angeforderte Webseite und führt das JavaScript auf der Seite aus, die 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 normaler HTTP-Verkehr.

Ajax Polling

Ajax Long-Polling:

  1. Ein Client fordert eine Webseite von einem Server an, der reguläres HTTP verwendet (siehe HTTP oben).
  2. Der Client empfängt die angeforderte Webseite und führt das JavaScript auf der Seite aus, die 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 Anforderung an den Server, um den Prozess neu zu starten.

Ajax Long-Polling

Gesendete HTML5-Server-Ereignisse (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

HTML5-Websockets:

  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

Komet:

Comet ist eine Sammlung von Techniken vor HTML5, die Streaming und Long-Polling verwenden, um Echtzeitanwendungen zu erreichen. Lesen Sie mehr auf wikipedia oder dieser Artikel.


Nun, welche von denen sollte ich für eine Echtzeit-App verwenden (die ich brauche   Code). Ich habe viel über Websockets gehört (mit socket.io [a   node.js library]) aber warum nicht PHP?

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

1840
hinzugefügt
Was ist der wahre Unterschied zwischen SSE und Websockets?
hinzugefügt der Autor Basj, Quelle
Warum sagst du Apache nicht zu benutzen?
hinzugefügt der Autor bobzer, Quelle
Ich konnte die Unterschiede zwischen Komet und ajax long polling nicht verstehen. In beiden Techniken senden wir (als Client) eine Ajax-Anfrage und warten mit einer offenen HTTP-Anfrage auf eine Antwort vom Server. @ Tième
hinzugefügt der Autor Eray, Quelle
F: Sagen wir in PHP, dass Sie websocket verwenden würden, würde jeder Client mit meinem Server über ws verbunden sein: hätte ihm ein Thread zugewiesen und seine Größe wäre ~ 2 MB, wie es bei normalen Anfragen der Fall ist? Wie würde das in Nodejs abweichen? Wie viele gleichzeitige Clients kann Nodejs verarbeiten und wann bricht es ab, was passiert?
hinzugefügt der Autor Muhammad Umer, Quelle
@Tieme Oh war das das? Ich dachte SSE meinte Server-Sent Events. Jedenfalls, danke, ich sehe es jetzt.
hinzugefügt der Autor index, Quelle
Das ist fantastisch! Ich lese gerade auf SSE und fand diesen Artikel, es ist sehr nett - wie ich Sachen jetzt verglichen habe, können Sie auch SSE hier einschließen, also können wir es auch mit Websocket vergleichen?
hinzugefügt der Autor index, Quelle
@Tieme Was ist die beste Methode, um Daten als Client für Android-Benutzer von Web-Socket-Server zu erhalten?
hinzugefügt der Autor Apple Appala, Quelle
Es wäre schön, wenn diese Antwort expliziter über die zugrunde liegende Technologie wäre. Welche TCP-Verbindungen werden verwendet? Werden zweite Verbindungen über die erste hergestellt, die für die ursprüngliche Anforderung verwendet wurde? Wie ist das HTTP-Pipelining beteiligt?
hinzugefügt der Autor Charlie, Quelle
Sie können das gleiche mit beiden Lösungen erreichen, aber der Mechanismus ist anders. Long-Polling verwendet "normale" HTTP-Daten, SSE verwendet ein anderes zugrunde liegendes Protokoll und benötigt eine andere Serverkonfiguration als Long-Polling.
hinzugefügt der Autor Tieme, Quelle
@Eray, hast du den letzten Absatz gelesen und den URLs nach mehr Informationen über den Kometen gefolgt?
hinzugefügt der Autor Tieme, Quelle
Nun, du könntest Apache benutzen, wenn du willst. Aber viele Leute benutzen Node.js, weil es eine Ereignisschleife hat. Aber für Apache, siehe stackoverflow.com/questions/12203443/…
hinzugefügt der Autor Tieme, Quelle
Ich stimme zu, haben Sie dieses Wissen oder kennen Sie einen Benutzer, der das tut?
hinzugefügt der Autor Tieme, Quelle
Ich denke, es sollte sein: "Der Client führt das JavaScript auf der Seite aus", also ist dies der Browser, nicht der Server. Klar?
hinzugefügt der Autor Tieme, Quelle
Du hast es genagelt ... tolle Antwort
hinzugefügt der Autor kunal, Quelle
Können Sie mir vorschlagen, welches Comet-Protokoll für Spring MVC verwendet wird?
hinzugefügt der Autor Yasir Shabbir Choudhary, Quelle
@Tieme was ist der Unterschied zwischen SSE und langem Ziehen? Aus Ihren Worten sind sie fast gleich.
hinzugefügt der Autor tomwang1013, Quelle
Um dem hinzuzufügen, was @Tieme bereits beantwortet hat, können die Einschränkungen von SSE und WS wie folgt gehandhabt werden: Das WS-Reconnect-Problem kann durch Verwendung einer geeigneten Client-Bibliothek gelöst werden, zum Beispiel tolle-websocket . SSE-Ursprungsproblem kann durch sendet CORS Header in der Antwort
hinzugefügt der Autor Piyush Kansal, Quelle
Ich nehme an, dass Long Polling (und wahrscheinlich auch Kometen) durch die Netzwerkinfrastruktur begrenzt wird, die eine kurze Zeitüberschreitung bei HTTP erzwingt.
hinzugefügt der Autor Ced, Quelle
@Tieme Ich war verloren mit Ihrer Erklärung an dem Punkt, wo Sie über Ajax Polling erklärten und Sie sagten "Ein Client fordert eine Webseite von einem Server mit regulärem HTTP (siehe HTTP oben) und dann die angeforderte Webseite führt JavaScript aus ... "Wie führt ein regulärer Webserver (zB Apache)" JavaScript "aus?"
hinzugefügt der Autor Olowookere Emmanuel, Quelle

Tieme hat sehr viel Mühe in seine ausgezeichnete Antwort gesteckt, aber ich denke, der Kern der OP-Frage ist, wie diese Technologien sich auf PHP beziehen und nicht wie jede Technologie funktioniert.

PHP ist die am häufigsten verwendete Sprache in der Web-Entwicklung neben der offensichtlichen Client-Seite HTML, CSS und Javascript. Dennoch hat PHP zwei Hauptprobleme, wenn es um Echtzeitanwendungen geht:

1) PHP begann als sehr einfaches CGI. PHP ist sehr weit fortgeschritten, da es in einem frühen Stadium ist, aber es geschah in kleinen Schritten. PHP hatte bereits viele Millionen von Benutzern, als es die einbettbare und flexible C-Bibliothek wurde, die es heute ist, von denen die meisten von seinem früheren Ausführungsmodell abhängig waren, so dass es noch keinen soliden Versuch unternommen hatte, dem zu entkommen CGI-Modell intern. Sogar die Kommandozeilen-Schnittstelle ruft die PHP-Bibliothek (libphp5.so unter Linux, php5ts.dll unter Windows, usw.) auf, als ob sie immer noch ein CGI wäre, das eine GET/POST-Anfrage verarbeitet. Es führt immer noch Code aus, als müsste er nur eine "Seite" erstellen und dann seinen Lebenszyklus beenden. Als Ergebnis hat es sehr wenig Unterstützung für Multi-Thread- oder Event-Driven-Programmierung (im PHP-Userspace), was es derzeit für Echtzeit-Multi-User-Anwendungen unpraktisch macht.

Beachten Sie, dass PHP Erweiterungen für die Bereitstellung von Ereignisschleifen (wie libevent) und Threads (wie pthreads) im PHP-Benutzerbereich bietet, aber sehr, sehr wenige der Anwendungen verwenden diese.

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

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

31
hinzugefügt
PHP 7 scheint als Plattform für Echtzeitanwendungen sehr vielversprechend zu sein. Welche Verbesserung/Änderung in PHP7 für Echtzeitanwendungen?
hinzugefügt der Autor I'll-Be-Back, Quelle
Eine kleine Korrektur: PHP wurde immer in C geschrieben, wie hier zu sehen ist: museum.php.net/php1 Auch "weniger verwendet (aber immens beliebter)" ist eher in sich widersprüchlich; vielleicht, was du meinst, ist "modischer"?
hinzugefügt der Autor IMSoP, Quelle
obwohl auch svn.php. net/viewvc/phpdoc/de/trunk/appendices/& hellip; && PHP "rel =" nofollow noreferrer "> web.archive.org/web/20090426061624/http://us3.php.net/…
hinzugefügt der Autor eis, Quelle
hinzugefügt der Autor eis, Quelle
@ I'll-Be-Back - feste Speicherverwaltung/Garbage-Collection, JIT-Compilation usw.
hinzugefügt der Autor JSON, Quelle
Ich werde den Teil über Perl entfernen, da es sich nicht gut mit offizieller Dokumentation vermischt, aber dies ist immer noch ein verwirrender Bereich in der frühen Entwicklung von PHP.
hinzugefügt der Autor JSON, Quelle
@IMSoP - Danke für die Korrektur, ich benutze PHP seit über einem Jahrzehnt und habe immer den Eindruck gehabt, dass es Wurzeln in Perl sind. Die PHP Geschichte Seite unterstützt eindeutig, dass es ursprünglich auch C war. Ich werde meine Antwort bearbeiten, sobald ich einen Moment finde.
hinzugefügt der Autor JSON, Quelle
Bitte editiere deine Antwort bezüglich der Wurzeln von PHP.
hinzugefügt der Autor Netverse, Quelle

Ich habe versucht, darauf aufmerksam zu machen und habe Beispiele aus einer Java-Perspektive gesammelt und geschrieben.

HTTP für Java-Entwickler

Reverse Ajax - Alter Stil

Async-Behandlung auf Serverseite

Reverse Ajax - Neuer Stil

Server Gesendete Ereignisse

Putting es hier für jeden Java-Entwickler, der das gleiche Thema untersucht.

7
hinzugefügt
Alle Links sind jetzt tot
hinzugefügt der Autor SpringLearner, Quelle
@SpringLearner danke, dass du es notiert hast. Ich habe die Links aktualisiert
hinzugefügt der Autor John, Quelle