Server-Sent Events in PHP: Wie man Daten in Echtzeit vom Server sendet

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

Server-Sent Events in PHP: Wenn der Server selbst an die Browser-Tür klopft

\n\n

Haben 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\n

In 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\n

Was sind Server-Sent Events und wozu braucht man sie?

\n\n

SSE (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\n

Wo 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
\n\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\n

Wie SSE funktioniert: Protokoll und Header

\n\n

SSE 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.

\n\n

Das grundlegende Protokoll sieht so aus:

\n
Content-Type: text/event-stream\nCache-Control: no-cache\nConnection: keep-alive\n\ndata: Hallo Welt\n\ndata: {"message": "Das ist JSON"}
\n\n

Jede 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.

\n\n

Unser erstes SSE-Skript in PHP schreiben

\n\n

Lassen 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\n

Datei sse.php:

\n
<?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\n

Beachten 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.

\n\n

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                

Blogs

Buchempfehlungen