Server-Sent Events in PHP: Wenn der Server selbst an die Browser-Tür klopft
\n\nHaben Sie sich jemals gefragt, wie die Newsfeeds bei Twitter, Wechselkurse an der Börse oder Benachrichtigungen in Messengern funktionieren? Richtig – die Daten kommen von selbst, ohne Seitenaktualisierung und ohne endlose Ajax-Anfragen. Die meisten Entwickler denken sofort an WebSockets, aber es gibt einen anderen, viel einfacheren und eleganteren Weg – Server-Sent Events (SSE).
\n\nIn diesem Artikel werden wir uns ansehen, wie man Server-Sent Events in PHP von Grund auf implementiert. Sie erfahren, wie Sie Daten in Echtzeit vom Server senden, ohne die Infrastruktur mit komplexen Bibliotheken zu belasten. Kein Node.js, keine Warteschlangen – nur reines PHP und HTML5.
\n\nWas sind Server-Sent Events und wozu braucht man sie?
\n\nSSE (Server-Sent Events) ist ein HTML5-Standard, der es dem Server ermöglicht, Daten über eine einzige HTTP-Verbindung an den Client zu senden. Im Gegensatz zu WebSockets, die in beide Richtungen funktionieren, ist SSE ein unidirektionaler Kanal: Daten fließen nur vom Server zum Client. Aber genau darin liegt sein Hauptvorteil: Die Implementierung ist so einfach, dass weder zusätzliche Bibliotheken noch spezielle Server erforderlich sind.
\n\nWo werden server-sent events php eingesetzt?
\n- \n
- Newsfeeds und Echtzeit-Benachrichtigungen \n
- Server- und Log-Überwachung \n
- Wechselkurse, Aktienkurse \n
- Fortschrittsanzeigen für langlaufende Operationen (Datei-Uploads, Videoverarbeitung) \n
- Chatbots und Benachrichtigungssysteme \n
Im Gegensatz zum klassischen Polling (bei dem der Client alle N Sekunden den Server abfragt) erstellt SSE PHP eine dauerhafte Verbindung, die keine wiederholten Handshakes und Header erfordert. Das spart Traffic und CPU-Ressourcen.
\n\nWie SSE funktioniert: Protokoll und Header
\n\nSSE basiert auf einer gewöhnlichen HTTP-Antwort mit einem speziellen Inhaltstyp. Der Server sendet Daten im Textformat unter Verwendung der Schlüsselwörter event, data, id und retry. Der Client empfängt den Stream und verarbeitet die Ereignisse, sobald sie eintreffen.
Das grundlegende Protokoll sieht so aus:
\nContent-Type: text/event-stream\nCache-Control: no-cache\nConnection: keep-alive\n\ndata: Hallo Welt\n\ndata: {"message": "Das ist JSON"}\n\nJede Nachricht beginnt mit data:, gefolgt vom Text. Wenn mehrere Zeilen gesendet werden sollen, schreibt man einfach mehrere data: hintereinander. Eine Leerzeile \\n\\n signalisiert das Ende der Nachricht.
Unser erstes SSE-Skript in PHP schreiben
\n\nLassen Sie uns ein einfaches Skript erstellen, das alle 2 Sekunden die aktuelle Uhrzeit sendet. Dies ist ein klassisches Beispiel, das sofort die Magie von Echtzeit PHP zeigt.
\n\nDatei sse.php:
<?php\n// Ausgabepufferung deaktivieren\nob_implicit_flush(true);\nob_end_flush();\n\n// SSE-Header setzen\nheader('Content-Type: text/event-stream');\nheader('Cache-Control: no-cache');\nheader('Connection: keep-alive');\nheader('X-Accel-Buffering: no'); // Für Nginx\n\nwhile (true) {\n // Daten zusammenstellen\n $data = [\n 'time' => date('H:i:s'),\n 'timestamp' => time()\n ];\n \n // Ereignis senden\n echo "data: " . json_encode($data) . "\\n\\n";\n \n // Prüfen, ob der Client die Verbindung geschlossen hat\n if (connection_aborted()) {\n break;\n }\n \n // Pause von 2 Sekunden\n sleep(2);\n}\n?>\n\nBeachten Sie: Wir verwenden eine Endlosschleife while(true), prüfen aber unbedingt connection_aborted(). Wenn der Client den Tab schließt, wird das Skript beendet, ohne den Server zu belasten.
Jetzt schreiben wir den Client-Teil in JavaScript:
\n<!DOCTYPE html>\n<html>\n<head>\n <title>SSE Demo PHP</title>\n</head>\n<body>\n <h2>Aktuelle Uhrzeit vom Server:</h2