© turgaygundogdu/Shutterstock.com
Einen WebSocket-Server in PHP aufsetzen

Vom Protokoll zur Lösung in purem PHP


Echtzeit wird im Web immer wichtiger: Instant Messaging, Benachrichtigungen, gemeinsame Bearbeitung von Inhalten und vieles mehr. Diese Technologien ermöglichen neue Features und treffen auf neue Anwendungsfälle. WebSockets wurden eingeführt, um die Beschränkungen des Pollings zu überwinden, indem sie eine bidirektionale Kommunikation zwischen Client und Server möglich machen. WebSockets werden häufig mit dem Node.js- und JavaScript-Ökosystem implementiert. Es ist aber auch möglich, WebSockets nur mit PHP zu integrieren.

Das Protokoll WebSocket wurde 2011 im RFC 6455 standardisiert [1] und ermöglicht den Austausch zwischen Client und Server in Echtzeit. Das entscheidende Merkmal der Funktionsweise liegt auf der Serverebene, da es nicht nur Antworten sendet, sondern auch spontan eine Nachricht an den Client senden kann. Das Protokoll bietet außerdem einen Vollduplex-Kommunikationskanal: Die Daten können gleichzeitig in beide Richtungen übertragen werden, es erlaubt somit eine starke Interaktivität.

Um einen WebSocket-Server einzurichten, muss ein Programm erstellt werden, das direkt vom Server ausgeführt wird (z. B. über einen Service). Es wird also nicht über einen Browser aufgerufen, wie man es von PHP gewohnt ist. Falls dieses Programm in JavaScript geschrieben werden soll, wenn bereits PHP verwendet wird, müssen auf der Serverseite zwei verschiedene Technologien implementiert werden. Dieser Schritt stellt bereits eine wichtige Entscheidung für das gesamte Projekt dar. Alles davon muss zum Leben erweckt werden. Somit muss für alles davon auch die Stabilität des Codes gewährleistet werden, es fallen Softwareupdates auf dem Server an und das Monitoring muss gemanagt werden. Es ist daher von Vorteil, auf Tools zurückzugreifen, mit denen sich der Programmierer bereits gut auskennt. Je größer die Anzahl der Werkzeuge, desto komplexer wird es, das System zu pflegen. An diesem Punkt können wir uns die Frage stellen: „Könnten wir einen WebSocket-Server direkt in PHP haben, wenn wir PHP bereits anderweitig einsetzen?“ Allein dadurch, dass man sich diese Frage stellt, kann man eine fundierte Entscheidung treffen, statt sich kopfüber auf die erste verfügbare Lösung zu stürzen. Die meisten Sprachen verfügen über mindestens eine Implementierung dieses Protokolls und man muss sich die Zeit nehmen, sie ausfindig zu machen, denn die geeignetste Lösung ist ein Kompromiss zwischen den Fähigkeiten des Teams, der Lebensdauer der Anwendung und der Art der zu entwickelnden Funktionen.

Wo anfangen?

Wir werden sehen, wie man WebSockets in PHP verwendet. Es ist empfehlenswert, sich zunächst mit dem Composer [2] vertraut zu machen, um damit die Abhängigkeiten zu verwalten. Dieses Tool hat sich als Standard etabliert; es ist wichtig, sein allgemeines Verhalten und seine Verwendung zu kennen. Da es eine große Anzahl an Packages gibt, kann es durchaus schwierig sein, sie zu sortieren. Hier sind zwei Referenz-Packages, die ich häufig verwende: Ratchet (cboden/ratchet [3] und ratchet/pawl [4]) und hoa/websocket [5]. Ratchet wird heute am häufigsten verwendet und erhält regelmäßigen Support. Aufgrund der Einfachheit des Codes bevorzuge ich jedoch Hoa, auch wenn es derzeit an Mitwirkenden mangelt, um das Projekt weiterzuentwickeln. Dies sind zwei solide und gut dokumentierte Implementierungen, die einen Blick wert sind, um die vollständige Funktionsweise des Protokolls zu verstehen.

Instant Messaging mit Ratchet

Um Ihnen die zu implementierende Gesamtlogik zu zeigen, ziehe ich ein Chatsystem zur Verdeutlichung heran. Dieses Beispiel, absichtlich vereinfacht, enthält die folgenden Funktionalitäten:

  • Der Client verbindet sich mit dem Server und wird in die Liste der Benutzer aufgenommen.

  • Der Client kann mit dem Senden von Nachrichten beginnen.

  • Nachrichten werden zwischen Benutzern ausgetauscht.

  • Der Client kann einen Benutzernamen angeben, der mit der Nachricht übermittelt wird.

In diesem Beispiel wird Ratchet verwendet, der Ansatz ist bei anderen Tools jedoch ähnlich. Unter der Haube verwendet Ratchet das ReactPHP-Ökosystem [6] und asynchrone Programmierung, was eine sehr effiziente Nutzung von Netzwerkübertragungen ermöglicht. Außerdem basiert ReactPHP auf dem Event-Loops-Pattern [7], das zur Weiterleitung von Nachrichten durch Anwendungscode verwendet wird. Bei jedem Ereignis auf einer Verbindung (Öffnen, Schließen, Empfangen einer Nachricht) wird ein Teil des Codes ausgeführt. Diese Beziehung zwischen den beiden Werkzeugen ist interessant, weil sie die Verwendung anderer ReactPHP-Funktionen, wie nicht blockierende Read Streams, vereinfacht.

Den Server einrichten

Bevor Echtzeitinteraktionen verwaltet werden, sollte der Server eingerichtet werden. Die aktuelle Version von Ratchet arbeitet mit PHP 7.4, es kann allerdings ab PHP 5.4.2 verwendet werden. Um es mit Composer zu installieren, muss lediglich der folgende Befehl ausgeführt werden:

composer require cboden/ratchet

Als Nächstes wird die PHP-Datei zur Deklaration des Servers erstellt, wobei nicht vergessen werden darf, die Abhängigkeiten zu laden. Dieser Server wird lokal auf Port 8080 erreichbar sein:

$app = new Ratchet\App('127.0.0.1', 8080); $app->route('/echo', new Ratchet\Server\EchoServer, ['*']); $app->run();

Durch Ausführen des PHP-Skripts im Terminal kann der Server ges...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang