WebSockets in PHP: Wie Sie Ihre Website zum Sprechen in Echtzeit bringen
\n\nStellen 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\nViele 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\nWenn 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\nWas ist ein WebSocket und warum versteht sich PHP damit?
\n\nEin 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\nDer 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\nPHP 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\nBibliotheken für WebSocket in PHP: Was wählen?
\n\nEs 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
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\nEinen einfachen WebSocket-Server mit PHP und Ratchet schreiben
\n\nLassen 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\nZuerst installieren wir Ratchet über Composer. Öffnen Sie ein Terminal im Stammverzeichnis des Projekts:
\n\ncomposer require cboden/ratchet\n\nJetzt erstellen wir eine Datei server.php:
<?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\