Warum WordPress keine WebSocket-Verbindungen halten kann und was stattdessen hilft

Früher oder später soll auf einer WordPress-Website etwas live passieren: eine neue Nachricht, die ohne Neuladen erscheint, eine Benachrichtigung in dem Moment, in dem eine Bestellung eingeht, eine Anzeige, wer gerade online ist, ein Anruf, der klingelt. Das Werkzeug dafür ist im Web ein WebSocket, eine Verbindung zwischen Browser und Server, die offen bleibt, sodass der Server senden kann, sobald etwas passiert.
Dann kommt die Überraschung: WordPress hat keinen WebSocket-Server, und der Host, auf dem es läuft, kann keine WebSocket-Verbindung halten. Dieser Beitrag erklärt, warum, was Websites üblicherweise dagegen tun und was es kostet, einen eigenen WebSocket-Server zu betreiben.
WordPress beantwortet eine Anfrage und hört auf
Jede Seite von WordPress, jeder Aufruf der REST API und jede admin-ajax-Anfrage funktionieren auf dieselbe Weise. Der Webserver gibt die Anfrage an PHP weiter, PHP lädt WordPress mit seinen Plugins und dem Theme, ermittelt die Antwort, sendet sie und hört auf. Die nächste Anfrage beginnt wieder bei null.
Diesem Modell verdankt WordPress, dass es fast überall läuft. Es ist aber auch der Grund, warum es keinen WebSocket halten kann. Ein WebSocket ist keine einzelne Anfrage, sondern eine Verbindung, die so lange offen bleibt wie die Seite, oft stundenlang. Um sie zu halten, bräuchte es für jede offene Seite einen PHP-Prozess, der die meiste Zeit nichts tut, und ein Host gibt einer Website nur wenige PHP-Prozesse, genug für Anfragen, die in Sekundenbruchteilen fertig sind. Eine Handvoll Besucher mit geöffneter Seite würde sie alle belegen, und die Website würde allen anderen nicht mehr antworten.
Davor schützen sich Hosts. Sie beenden Anfragen, die zu lange laufen, oft nach 30 bis 60 Sekunden, und in den meisten Tarifen darf eine Website weder einen eigenen Prozess im Hintergrund starten noch einen Port dafür öffnen. Selbst wo der Host das erlaubt, müssen der Server vor PHP und jeder Proxy vor diesem Server so eingerichtet sein, dass sie einen WebSocket durchlassen.
Polling: immer wieder fragen
Der übliche Ausweg ist Polling. Die Seite fragt den Server alle paar Sekunden: „Gibt es etwas Neues?“ Meistens lautet die Antwort Nein.
Jede dieser Fragen ist eine vollständige WordPress-Anfrage: PHP startet, lädt WordPress und seine Plugins, fragt die Datenbank ab und antwortet. Bei 50 Besuchern auf einer Seite, die alle 5 Sekunden fragt, sind das 10 vollständige WordPress-Anfragen pro Sekunde, Sekunde für Sekunde, und die meiste Zeit vergeblich. Fragt die Seite seltener, wirkt die Website träge, und eine Nachricht braucht eine halbe Minute, bis sie erscheint. Fragt sie öfter, kommt der Host ins Schwitzen oder schickt eine Warnung wegen der Ressourcennutzung.
WordPress hat dafür eine eigene Variante, die Heartbeat API, die alle 15 bis 60 Sekunden fragt. Zum Speichern von Entwürfen und um anzuzeigen, wer gerade einen Beitrag bearbeitet, reicht sie. Für einen Chat oder einen Anruf ist sie viel zu langsam.
Long Polling und Server-Sent Events, bei denen der Server die Anfrage offen hält, bis etwas passiert, sehen nach einer Lösung aus. Auf WordPress sind sie keine: Jede wartende Anfrage belegt einen PHP-Prozess und stößt damit direkt an dieselbe Grenze wie ein WebSocket.
Ein eigener WebSocket-Server
Die eigentliche Lösung ist ein Server, der dafür gebaut ist, viele offene Verbindungen zu halten, neben WordPress statt darin. Viele Teams bauen sich einen. Das braucht es dafür:
- Einen eigenen Server, meist einen kleinen virtuellen Server mit Node.js oder einer anderen Laufzeitumgebung, die für lange Verbindungen gemacht ist, mit eigenen Updates und eigener Überwachung.
- Ein Zertifikat und einen Proxy, damit sich der Browser über
wss://auf Ihrer Domain verbinden kann. - Ihre Nutzer kennen. Der WebSocket-Server sieht die WordPress-Anmeldung nicht. Ihre Website muss deshalb jeder Seite ein signiertes Token mitgeben, und der Server muss es prüfen und entscheiden, wer welchem Kanal beitreten darf.
- Einen Weg, über den WordPress sendet. Passiert etwas in WordPress, muss ein Hook es dem WebSocket-Server mitteilen, der es dann an die richtigen Browser sendet.
- Mehr als einen, wenn Sie wachsen. Ein einziger Server ist eine einzige Stelle, an der jede Verbindung abbrechen kann. Zwei oder mehr brauchen einen Weg, Nachrichten untereinander zu teilen, und Seiten müssen sich reibungslos neu verbinden, wenn ein Server neu startet.
Nichts davon ist exotisch, aber es ist ein zweites System, das Sie neben WordPress am Laufen halten müssen, solange die Website Live-Funktionen hat. Für Anrufe ist das erst der Anfang: Ein Anruf braucht außerdem STUN- und TURN-Server, und Gruppenanrufe brauchen Medienserver, wie unser Beitrag darüber erklärt, wie Gruppen-Videoanrufe funktionieren.
Oder eine Echtzeit-Cloud hält die Verbindungen
Der andere Weg ist ein gehosteter Echtzeit-Dienst. Die Browser halten ihre offenen Verbindungen zum Dienst, nicht zu Ihrem Host. Passiert etwas auf Ihrer Website, sendet WordPress eine kurze Anfrage an den Dienst, und der Dienst stellt sie jeder Seite zu, die sie bekommen soll. Ihr Host beantwortet nur gewöhnliche Anfragen, wie er es schon immer getan hat.
WordPress bleibt der Ort, an dem Ihre Daten liegen. Der Dienst überträgt nur Ereignisse von der Website zu den Seiten und zwischen den Seiten, sodass sich nichts daran ändert, wie Ihre Website Beiträge, Nutzer oder Bestellungen speichert.
Wie WordPlus Cloud das für WordPress löst
WordPlus Cloud for WordPress ist diese Cloud, für jedes Plugin auf einer WordPress-Website:
- Nichts zu betreiben. Die Echtzeit-Server, die Relays für Anrufe, die Medienserver und die KI laufen in der Cloud. Ihre Website braucht nur ein Abonnement, mit einem Preis pro Website und ohne Limits für Mitglieder oder Nachrichten.
- Jedes Plugin auf der Website kann sie nutzen. Better Messages und Live Stream nutzen sie sofort. Plugins, die für das Pusher-Protokoll gebaut sind, verbinden sich mit unseren Hosts und den Schlüsseln Ihrer Website, und alle anderen Plugins, Themes und eigener Code verbinden sich über unsere Entwickler-API.
- Ihre Daten bleiben in WordPress. Unterhaltungen, Mitglieder und Dateien bleiben in Ihrer Datenbank. Nachrichten durchqueren die Cloud versiegelt, mit einem Schlüssel, den Ihre Website hat, sodass wir sie weiterleiten, ohne sie zu lesen.
- Mehr als WebSockets. Dasselbe Abonnement bringt Anrufe, die immer durchkommen, Gruppenanrufe, Push-Benachrichtigungen für Browser und Smartphones, Live-Streaming, Ihre eigenen mobilen Apps und KI, über dieselbe Verbindung.
Eine Seite hält eine einzige Verbindung, die sich alle Plugins der Website teilen, und sie wechselt ohne Abbruch zu einem anderen Server, wenn einer neu startet. Ihr Host macht wieder, was er gut kann: Anfragen beantworten.
Entdecken Sie WordPlus Cloud for WordPress oder die Preise für so viele Websites, wie Sie haben.