Long-Polling, WebSockets, SSE und Comet in PHP: vollständige Analyse mit Code

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Was verbirgt sich hinter der „Live“-Datenaktualisierung? Wir verstehen die Echtzeit-Technologien

\n\n

Haben Sie sich jemals gefragt, wie ein Chat funktioniert, bei dem Nachrichten sofort ankommen, oder ein Börsenticker, der sich von selbst aktualisiert? Die klassische HTTP-Anfrage (bei der der Browser den Server anklopft und der Server antwortet) ist hier ungeeignet – zu langsam und ineffizient. Man braucht die Magie der Echtzeit.

\n\n

Auf Stack Overflow hat die Frage „What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?“ tausende Aufrufe. Das bedeutet, dass Verwirrung bei diesen Begriffen normal ist. Heute bringen wir Ordnung in die Sache, schreiben echten PHP-Code und verstehen, wann welche Technologie eingesetzt wird.

\n\n

Wir werden keine komplexen Frameworks verwenden – nur reines PHP und ein paar beliebte Bibliotheken. Los geht's!

\n\n

1. HTTP Polling (Einfache Abfrage) – der Urvater der Technologien

\n\n

Bevor wir über Fortgeschrittenes sprechen, erinnern wir uns an das grundlegende Polling. Der Client (JavaScript) sendet einfach alle N Sekunden eine Anfrage an den Server. Der Server antwortet: „Keine neuen Daten“ oder „Hier sind die Daten“.

\n\n

PHP-Code (Serverseite):

\n
<?php\n// polling_server.php\nheader('Content-Type: application/json');\n\n// Simuliere Datenabruf\n$data = ['message' => 'Hallo um ' . date('H:i:s')];\necho json_encode($data);\n
\n\n

Clientseite (JavaScript):

\n
setInterval(() => {\n    fetch('polling_server.php')\n        .then(response => response.json())\n        .then(data => console.log(data.message));\n}, 3000); // Alle 3 Sekunden
\n\n

Vorteile: Einfachheit. Nachteile: viele unnötige Anfragen, Serverlast, Verzögerung von bis zu N Sekunden. Für einen Chat ist das der Tod.

\n\n

2. Long-Polling – ein eleganter Umweg

\n\n

Long-Polling ist eine verbesserte Version des Polling. Der Client öffnet eine HTTP-Anfrage, und der Server antwortet nicht sofort, wenn keine Daten vorhanden sind. Er hält die Verbindung offen (wartet). Sobald Daten erscheinen, sendet der Server die Antwort und schließt die Verbindung. Der Client öffnet sofort eine neue Anfrage.

\n\n

Aus Clientsicht ist es ein normaler fetch. Aus Serversicht muss man „schlafen“ und aufwachen können.

\n\n

Beispiel für Long-Polling in PHP

\n
<?php\n// long_polling.php\nheader('Content-Type: application/json');\nheader('Cache-Control: no-cache');\n\n// Simuliere das Warten auf neue Nachrichten (z.B. aus einer Datei oder DB)\n$lastCheck = time();\n$timeout = 30; // maximal 30 Sekunden warten\n\nwhile (time() - $lastCheck < $timeout) {\n    // Prüfen, ob neue Daten vorhanden sind\n    $newData = checkForNewMessages(); // Ihre Funktion\n    if ($newData !== null) {\n        echo json_encode(['status' => 'ok', 'data' => $newData]);\n        exit;\n    }\n    // 1 Sekunde schlafen, um die CPU nicht zu belasten\n    sleep(1);\n}\n\n// Wenn 30 Sekunden lang keine Daten kamen – leere Antwort senden\necho json_encode(['status' => 'timeout', 'data' => null]);\n
\n\n

Wichtig: Ersetzen Sie in einem echten Projekt sleep(1) durch usleep(500000) (0,5 Sek.) und verwenden Sie nicht-blockierende Prüfungen (z.B. filemtime() für eine Datei oder SELECT ... FOR UPDATE mit Timeout in der DB).

\n\n

Wo verwendet: Alte Chats, Benachrichtigungen auf Websites ohne WebSockets. Nachteil: immer noch viele Verbindungen, der Server verbraucht Ressourcen für „hängende“ Anfragen.

\n\n

3. Server-Sent Events (SSE) – einseitiger Kanal vom Server

\n\n

SSE (Server-Sent Events) ist eine in HTML5 integrierte Technologie. Der Server kann jederzeit Daten an den Client senden, aber nur in eine Richtung (Server → Client). Der Client ist ein normaler EventSource in JavaScript.

\n\n

SSE ist ideal geeignet für: Nachrichtenfeeds, Kurse, Logs, Benachrichtigungen.

\n\n

PHP-Code (Server):

\n
<?php\n// sse_server.php\nheader('Content-Type: text/event-stream');\nheader('Cache-Control: no-cache'                

Blogs

Buchempfehlungen