- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
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:
-
Starten Sie den WebSocket-Server:
php websocket.php -
Ö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:
- websocket.php: Einstiegspunkt und Hauptskript
- WebSocketServer: Verarbeitet WebSocket-Verbindungen und -Nachrichten
- WebSocketConnection: Repräsentiert eine aktive WebSocket-Verbindung
- 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
- Langlebige Verbindungen: Der Server kann Verbindungen über längere Zeit offen halten
- Echtzeit-Kommunikation: Bidirektionale Kommunikation in Echtzeit
- Ressourceneffizienz: Geringerer Overhead im Vergleich zu HTTP-Polling
- Skalierbarkeit: Der WebSocket-Server kann unabhängig vom HTTP-Server skaliert werden
Bekannte Einschränkungen
- Der WebSocket-Server unterstützt derzeit keine SSL/TLS-Verschlüsselung direkt. Für sichere Verbindungen sollte ein Reverse-Proxy wie Nginx verwendet werden.
- Die Implementierung ist auf einfache Anwendungsfälle ausgelegt und könnte für komplexere Szenarien erweitert werden.