Was ist WebSocket und wozu braucht man die Bibliothek Ratchet für PHP?
WebSocket ist ein Protokoll, das eine dauerhafte bidirektionale Verbindung zwischen Client (Browser) und Server ermöglicht. Im Gegensatz zum klassischen HTTP, bei dem Anfragen nur vom Client initiiert werden, erlaubt WebSocket dem Server, Daten sofort zu senden, ohne auf eine Anfrage zu warten. Dies ist die ideale Lösung für Chats, Echtzeit-Benachrichtigungen, Online-Spiele, Tracker und alle Anwendungen, bei denen geringe Latenz wichtig ist.
Standard-PHP hat keine integrierte Unterstützung für WebSocket, aber die Bibliothek Ratchet (die die Komponente ReactPHP verwendet) schließt diese Lücke. Ratchet ist eine asynchrone Bibliothek, die es ermöglicht, einen WebSocket-Server direkt aus PHP heraus zu starten und dabei viele Verbindungen gleichzeitig ohne Blockierung zu verarbeiten.
Hauptfunktionen von Ratchet
- Asynchronität – basierend auf ReactPHP, blockiert den Thread nicht beim Warten auf Daten.
- Protokollunterstützung – WebSocket (RFC 6455) sowie HTTP-Komponenten (für hybride Anwendungen).
- Einfachheit – minimaler Code zum Starten des Servers.
- Skalierbarkeit – kann mit ZeroMQ oder Redis für den Clusterbetrieb kombiniert werden.
- Kompatibilität – funktioniert mit allen modernen Browsern über das integrierte WebSocket-Objekt.
Installation von Ratchet
Die Installation erfolgt über Composer. Öffnen Sie ein Terminal im Stammverzeichnis des Projekts und führen Sie Folgendes aus:
composer require cboden/ratchetNach der Installation erscheinen im Ordner vendor alle Abhängigkeiten, einschließlich ReactPHP.
Erstellen eines einfachen WebSocket-Servers mit Ratchet
Erstellen wir eine Datei server.php:
<?phprequire 'vendor/autoload.php';
use Ratchet\\MessageComponentInterface;use Ratchet\\ConnectionInterface;use Ratchet\\Server\\IoServer;use Ratchet\\Http\\HttpServer;use Ratchet\\WebSocket\\WsServer;
class Chat implements MessageComponentInterface { protected $clients;
public function __construct() { $this->clients = new \\SplObjectStorage; }
public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); echo "Neue Verbindung: {$conn->resourceId}"; }
public function onMessage(ConnectionInterface $from, $msg) { foreach ($this->clients as $client) { if ($from !== $client) { $client->send($msg); } } }
public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); echo "Verbindung getrennt: {$conn->resourceId}"; }
public function onError(ConnectionInterface $conn, \\Exception $e) { echo "Fehler: {$e->getMessage()}"; $conn->close(); }}
$server = IoServer::factory( new HttpServer( new WsServer( new Chat() ) ), 8080);
echo "Server läuft auf Port 8080";$server->run();Erklärung des Codes
Chat– Klasse, dieMessageComponentInterfaceimplementiert. InonOpenspeichern wir die Verbindung, inonMessagesenden wir die Nachricht an alle außer dem Absender.IoServer::factory– erstellt einen Server basierend auf ReactPHP. Wir umschließen unsere Komponente mitWsServer(für WebSocket) undHttpServer(für Kompatibilität mit HTTP-Anfragen).- Der Server hört auf Port 8080. Starten Sie ihn mit dem Befehl:
php server.php.
Clientseite (JavaScript)
Erstellen Sie eine HTML-Datei client.html:
<!DOCTYPE html><html><head> <title>WebSocket-Chat</title> <script> const ws = new WebSocket('ws://localhost:8080');