WebSockets in PHP: Echtzeit-Anwendungen ohne Magie erstellen

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

WebSockets in PHP: Wie Sie Ihre Website zum Sprechen in Echtzeit bringen

\n\n

Stellen Sie sich eine normale Website vor. Sie klicken auf einen Button – und warten, bis die Seite neu geladen wird. Das ist wie das Versenden eines Briefes per Post: Sie werfen ihn in den Briefkasten und hoffen, dass er ankommt. Stellen Sie sich nun vor, Sie telefonieren – Sie hören Ihren Gesprächspartner sofort. WebSockets sind sozusagen das „Telefon“ für das Web. Und ja, das funktioniert mit PHP.

\n\n

Viele denken, dass WebSocket nur etwas für Node.js oder Python ist. Aber PHP, obwohl es ursprünglich zum „Zusammenkleben“ von HTML entwickelt wurde, ist längst über diese Anfänge hinausgewachsen. Heute schauen wir uns an, wie man eine Echtzeit-Anwendung mit PHP erstellt – sei es ein Chat, eine Benachrichtigungsleiste oder Live-Analysen. Und das ohne Krücken.

\n\n

Wenn Sie jemals versucht haben, einen Live-Chat mit PHP über Long Polling zu realisieren und gesehen haben, wie der Server unter 1000 Anfragen pro Sekunde zusammenbricht – dann ist dieser Artikel für Sie. WebSockets ändern die Spielregeln.

\n\n

Was ist ein WebSocket und warum versteht sich PHP damit?

\n\n

Ein WebSocket ist ein bidirektionaler Kommunikationskanal zwischen Browser und Server. Im Gegensatz zu HTTP, bei dem der Client immer die Anfrage initiiert, kann der Server hier selbst Daten an den Client senden. Das ermöglicht echte Echtzeit und nicht nur eine Simulation.

\n\n

Der entscheidende Unterschied zum Long Polling (bei dem der Client ständig fragt: „Na, gibt es Neuigkeiten?“) ist, dass die WebSocket-Verbindung offen bleibt. Einmal aufgebaut – und Sie kommunizieren ohne Unterbrechung. Die Einsparung an Traffic und Ressourcen ist enorm.

\n\n

PHP als Sprache führt Skripte sequenziell aus. Das hindert es jedoch nicht daran, ein hervorragender Server für WebSocket zu sein. Das Geheimnis liegt in der Architektur: Wir starten PHP nicht über einen Webserver (Apache/Nginx) für jede Verbindung, sondern verwenden es als eigenständigen Daemon. Und hier kommen die Bibliotheken ins Spiel.

\n\n

Bibliotheken für WebSocket in PHP: Was wählen?

\n\n

Es gibt zwei sehr beliebte Bibliotheken – und beide sind eine Betrachtung wert:

\n\n
    \n
  • Ratchet – der Urvater der PHP-WebSockets. Zuverlässig, bewährt, aber etwas „altmodisch“. Nutzt ein ereignisbasiertes Modell auf Basis von ReactPHP. Ideal für einfache Chats und Benachrichtigungen.
  • \n
  • Swoole – ein Biest. Es ist nicht nur eine Bibliothek, sondern eine ganze Engine, die den PHP-Kern neu schreibt. Bietet Asynchronität, Coroutinen und eine Leistung, die an Go heranreicht. Erfordert jedoch die Installation einer Erweiterung auf dem Server.
  • \n
\n\n

Für den ersten Einstieg empfehle ich Ratchet – es ist einfacher zu erlernen und erfordert keine Änderungen an der php.ini. Außerdem funktioniert es hervorragend in Kombination mit ReactPHP, das wir heute ebenfalls ansprechen werden.

\n\n

Einen einfachen WebSocket-Server mit PHP und Ratchet schreiben

\n\n

Lassen Sie uns einen einfachen Echo-Server erstellen. Er nimmt Nachrichten vom Client entgegen und sendet sie zurück. Das ist das klassische „Hello, World“ für WebSocket.

\n\n

Zuerst installieren wir Ratchet über Composer. Öffnen Sie ein Terminal im Stammverzeichnis des Projekts:

\n\n
composer require cboden/ratchet
\n\n

Jetzt erstellen wir eine Datei server.php:

\n\n
<?php\nrequire __DIR__ . '/vendor/autoload.php';\n\nuse Ratchet\\MessageComponentInterface;\nuse Ratchet\\ConnectionInterface;\n\nclass EchoServer implements MessageComponentInterface {\n    public function onOpen(ConnectionInterface $conn) {\n        echo "Neue Verbindung: {$conn->resourceId}\\n";\n    }\n\n    public function onMessage(ConnectionInterface $from, $msg) {\n        echo "Empfangen: {$msg}\\n";\n        $from->send("Echo: {$msg}");\n    }\n\n    public function onClose(ConnectionInterface $conn) {\n        echo "Verbindung {$conn->resourceId} geschlossen\\n";\n    }\n\n    public function onError(ConnectionInterface $conn, \\Exception $e) {\n        echo "Fehler: {$e->getMessage()}\\n";\n        $conn->close();\n    }\n}\n\n// Server starten\nuse Ratchet\\Server\\IoServer;\nuse Ratchet\\Http\\HttpServer;\nuse Ratchet\\WebSocket\\WsServer;\n\                

Blogs

Buchempfehlungen