Files
michaelschiemer/README-websocket.md
Michael Schiemer 55a330b223 Enable Discovery debug logging for production troubleshooting
- Add DISCOVERY_LOG_LEVEL=debug
- Add DISCOVERY_SHOW_PROGRESS=true
- Temporary changes for debugging InitializerProcessor fixes on production
2025-08-11 20:13:26 +02:00

3.8 KiB

WebSocket Server

Dieses Dokument beschreibt die Implementierung und Verwendung des WebSocket-Servers.

Übersicht

Der WebSocket-Server ist als eigenständiger Prozess implementiert, der unabhängig vom HTTP-Server läuft. Dies ermöglicht langlebige Verbindungen, die mit dem PHP-FPM/Apache-Modell nicht möglich wären.

Starten des WebSocket-Servers

Der WebSocket-Server kann mit folgendem Befehl gestartet werden:

php websocket.php

Oder, wenn die Ausführungsrechte gesetzt sind:

./websocket.php

Der Server läuft standardmäßig auf 0.0.0.0:8080 und kann über WebSocket-Clients erreicht werden.

Konfiguration

Die Konfiguration des WebSocket-Servers erfolgt direkt in der websocket.php-Datei. Hier können Host und Port angepasst werden:

$server->start('0.0.0.0', 8080);

Implementierung von WebSocket-Controllern

WebSocket-Controller werden wie normale HTTP-Controller implementiert, geben jedoch ein WebSocketResult-Objekt zurück. Hier ist ein Beispiel:

#[Route(path: '/chat/websocket', method: Method::GET)]
public function chatWebSocket(): WebSocketResult
{
    return new WebSocketResult()
        ->onConnect(function (WebSocketConnection $connection) {
            // Handler für neue Verbindungen
        })
        ->onMessage(function (WebSocketConnection $connection, string $message) {
            // Handler für eingehende Nachrichten
        })
        ->onClose(function (WebSocketConnection $connection, int $code, string $reason) {
            // Handler für geschlossene Verbindungen
        })
        ->onError(function (WebSocketConnection $connection, \Throwable $error) {
            // Handler für Fehler
        });
}

Testen mit dem ChatController

Der bestehende ChatController kann als Beispiel für die Verwendung von WebSockets dienen. Um ihn zu testen:

  1. Starten Sie den WebSocket-Server:

    php websocket.php
    
  2. Öffnen Sie eine WebSocket-Verbindung zum Server (z.B. mit JavaScript):

    const socket = new WebSocket('ws://localhost:8080/chat/websocket');
    
    socket.onopen = function(e) {
      console.log("Verbindung hergestellt");
    };
    
    socket.onmessage = function(event) {
      console.log(`Daten empfangen: ${event.data}`);
    };
    
    socket.onclose = function(event) {
      if (event.wasClean) {
        console.log(`Verbindung geschlossen, Code=${event.code} Grund=${event.reason}`);
      } else {
        console.log('Verbindung unterbrochen');
      }
    };
    
    socket.onerror = function(error) {
      console.log(`Fehler: ${error.message}`);
    };
    
    // Nachricht senden
    socket.send(JSON.stringify({
      type: 'chat_message',
      message: 'Hallo Welt!'
    }));
    

Architektur

Der WebSocket-Server verwendet folgende Komponenten:

  1. websocket.php: Einstiegspunkt und Hauptskript
  2. WebSocketServer: Verarbeitet WebSocket-Verbindungen und -Nachrichten
  3. WebSocketConnection: Repräsentiert eine aktive WebSocket-Verbindung
  4. WebSocketResult: Definiert Handler für WebSocket-Ereignisse

Der Server nutzt das bestehende Routing-System, um WebSocket-Anfragen an die entsprechenden Controller weiterzuleiten.

Vorteile gegenüber der HTTP-basierten Implementierung

  1. Langlebige Verbindungen: Der Server kann Verbindungen über längere Zeit offen halten
  2. Echtzeit-Kommunikation: Bidirektionale Kommunikation in Echtzeit
  3. Ressourceneffizienz: Geringerer Overhead im Vergleich zu HTTP-Polling
  4. Skalierbarkeit: Der WebSocket-Server kann unabhängig vom HTTP-Server skaliert werden

Bekannte Einschränkungen

  1. Der WebSocket-Server unterstützt derzeit keine SSL/TLS-Verschlüsselung direkt. Für sichere Verbindungen sollte ein Reverse-Proxy wie Nginx verwendet werden.
  2. Die Implementierung ist auf einfache Anwendungsfälle ausgelegt und könnte für komplexere Szenarien erweitert werden.