Was ist WebSocket und warum wird es in PHP benötigt
Das traditionelle HTTP-Protokoll arbeitet nach dem „Anfrage-Antwort“-Schema: Der Client sendet eine Anfrage, der Server verarbeitet sie und sendet eine Antwort zurück. Um neue Daten zu erhalten, muss der Client die Seite ständig neu laden oder AJAX-Polling (periodische Anfragen an den Server) verwenden. Dieser Ansatz erzeugt eine übermäßige Last und gewährleistet keine echte „Live“-Verbindung.
WebSocket (RFC 6455) ist ein Protokoll, das eine dauerhafte bidirektionale Verbindung zwischen Client (Browser) und Server herstellt. Nach dem Handshake können Daten in Echtzeit in beide Richtungen übertragen werden, ohne erneute HTTP-Anfragen. Dies ist die ideale Lösung für:
- Chats und Messenger
- Nachrichtenfeeds und Benachrichtigungen
- Gemeinsame Dokumentenbearbeitung
- Spiele und Auktionen
- Monitoring und Dashboards
Viele glauben, dass PHP aufgrund seiner synchronen Natur nicht für Echtzeit-Aufgaben geeignet ist. Mit dem Aufkommen von Bibliotheken wie Ratchet und ReactPHP hat sich die Situation jedoch grundlegend geändert. PHP kann effektiv mit WebSocket arbeiten, indem es eine ereignisgesteuerte Architektur und nicht-blockierende Ein-/Ausgabe verwendet.
Architektur einer WebSocket-Anwendung in PHP
Bevor wir Code schreiben, ist es wichtig zu verstehen, wie eine WebSocket-Verbindung auf der Serverseite von PHP aufgebaut ist.
Phasen der Verbindungsherstellung
- HTTP-Handshake: Der Client sendet eine spezielle HTTP-Anfrage mit dem Header
Upgrade: websocket. Der Server überprüft den SchlüsselSec-WebSocket-Keyund sendet eine Antwort mit dem Status 101 Switching Protocols zurück. - Protokollwechsel: Nach erfolgreichem Handshake wird die Verbindung in den WebSocket-Modus versetzt. Der weitere Datenaustausch erfolgt über binäre Frames.
- Duplex-Kommunikation: Server und Client können jederzeit Nachrichten senden, bis die Verbindung von einer Seite geschlossen wird.
Synchrones PHP vs. Asynchrones PHP
Ein normales PHP-Skript arbeitet synchron: Eine Anfrage – ein Prozess, nach der Antwort wird das Skript beendet. Für WebSocket wird ein dauerhaft laufender Prozess benötigt, der einen Port abhört und viele gleichzeitige Verbindungen verarbeitet. Hier kommt ReactPHP ins Spiel – eine Bibliothek, die eine Ereignisschleife (Event Loop) für PHP implementiert.
Die Bibliothek Ratchet baut auf ReactPHP auf und bietet eine benutzerfreundliche Oberfläche zur Erstellung von WebSocket-Servern. Sie übernimmt die Low-Level-Arbeit mit Sockets, das Parsen von Frames und die Verbindungsverwaltung.
Praktische Umsetzung: Erstellen eines Echtzeit-Chats
Betrachten wir die Erstellung eines einfachen Chats mit WebSocket unter Verwendung von Ratchet. Dieses Beispiel kann an jede Echtzeit-Aufgabe angepasst werden.
Schritt 1: Installation der Abhängigkeiten
Stellen Sie sicher, dass Composer (der Abhängigkeitsmanager für PHP) installiert ist. Installieren Sie Ratchet und seine Abhängigkeiten:
composer require cboden/ratchetSchritt 2: Erstellen der Handler-Klasse
Erstellen wir eine Datei ChatServer.php, die Verbindungen und Nachrichten verwaltet:
<?phpnamespace MyApp;
use Ratchet\\MessageComponentInterface;use Ratchet\\ConnectionInterface;
class ChatServer implements MessageComponentInterface{ protected $clients;
public function __construct() { // SplObjectStorage – eine praktische Möglichkeit, Verbindungsobjekte zu speichern $this->clients = new \\SplObjectStorage; echo "Server gestartet!"; }
public function onOpen(ConnectionInterface $conn) { // Neuer Client hat sich verbunden $this->clients->attach($conn); echo "Neue Verbindung: {$conn->resourceId}"; }
public function onMessage(Connectio