Waarom WordPress geen websocket kan openhouden, en wat je dan wel doet

Vroeg of laat wil een WordPress-website dat er iets live gebeurt: een nieuw bericht dat verschijnt zonder te herladen, een melding zodra er een bestelling binnenkomt, een teller van wie er online is, een gesprek dat overgaat. Het middel daarvoor op het web is een websocket, een verbinding tussen de browser en een server die open blijft, zodat de server iets kan versturen op het moment dat het gebeurt.
Dan volgt de verrassing: WordPress heeft geen websocketserver, en de hosting waarop het draait, kan er ook geen draaien. In dit artikel lees je waarom, wat websites er meestal aan doen, en wat het kost om een eigen websocketserver te draaien.
WordPress beantwoordt een verzoek en stopt
Elke pagina van WordPress, elke REST API-aanroep en elk admin-ajax-verzoek werkt op dezelfde manier. De webserver geeft het verzoek door aan PHP, PHP laadt WordPress met zijn plugins en thema, bepaalt het antwoord, verstuurt het en stopt. Het volgende verzoek begint weer bij nul.
Door dat model draait WordPress bijna overal. Het is ook de reden dat het geen websocket kan openhouden. Een websocket is niet één verzoek, maar een verbinding die open blijft zolang de pagina open is, vaak urenlang. Om die vast te houden, zou er voor elke open pagina een PHP-proces nodig zijn dat het grootste deel van de tijd niets doet, en een hostingpakket geeft een website maar een klein aantal PHP-processen, genoeg voor verzoeken die in een fractie van een seconde klaar zijn. Een handvol bezoekers met een pagina open zou ze allemaal bezetten, en de website zou niemand anders meer antwoorden.
Hostingproviders beschermen zich daartegen. Ze breken verzoeken af die te lang duren, vaak na 30 tot 60 seconden, en bij de meeste pakketten mag een website geen eigen proces op de achtergrond starten of er een poort voor openen. Zelfs waar de provider het toestaat, moeten de server vóór PHP, en elke proxy vóór die server, zo ingesteld zijn dat ze een websocket doorlaten.
Polling: steeds opnieuw vragen
De gebruikelijke uitweg is polling. De pagina vraagt de server om de paar seconden: “is er iets nieuws?” Meestal is het antwoord nee.
Elk van die vragen is een volledig WordPress-verzoek: PHP start, laadt WordPress en zijn plugins, raadpleegt de database en antwoordt. Met 50 bezoekers op een pagina die elke 5 seconden pollt, zijn dat 10 volledige WordPress-verzoeken per seconde, elke seconde, meestal voor niets. Vraag je minder vaak, dan voelt de website traag aan, met een bericht dat pas na een halve minuut verschijnt. Vraag je vaker, dan krijgt je hosting het zwaar, of stuurt je provider een waarschuwing over het resourcegebruik.
WordPress heeft hier een eigen versie van, de Heartbeat API, die elke 15 tot 60 seconden vraagt. Die volstaat om concepten op te slaan en te tonen wie een bericht aan het bewerken is. Voor een chat of een gesprek is die veel te traag.
Long polling en server-sent events, waarbij de server het verzoek openhoudt tot er iets gebeurt, lijken een oplossing. Op WordPress zijn ze dat niet: elk wachtend verzoek houdt een PHP-proces bezet, en dat loopt meteen tegen dezelfde grens aan als een websocket.
Een eigen websocketserver
De echte oplossing is een server die gemaakt is om veel open verbindingen vast te houden, naast WordPress in plaats van erin. Veel teams bouwen er een. Wat er bij komt kijken:
- Een eigen server, meestal een kleine virtuele server met Node.js of een andere runtime die gemaakt is voor lange verbindingen, met zijn eigen updates en monitoring.
- Een certificaat en een proxy, zodat de browser via
wss://op je eigen domein verbinding kan maken. - Je gebruikers kennen. De websocketserver ziet de WordPress-login niet, dus je website moet elke pagina een ondertekend token geven, en de server moet dat controleren en bepalen wie aan welk kanaal mag deelnemen.
- Een manier waarop WordPress kan versturen. Als er iets gebeurt in WordPress, moet een hook dat doorgeven aan de websocketserver, die het dan naar de juiste browsers stuurt.
- Meer dan één, naarmate je groeit. Eén server is één plek waar elke verbinding kan wegvallen. Twee of meer hebben een manier nodig om berichten onderling te delen, en pagina’s moeten soepel opnieuw verbinding maken als een server herstart.
Niets daarvan is exotisch, maar het is een tweede systeem dat je naast WordPress draaiende moet houden, zolang de website live functies heeft. Voor gesprekken is het pas het begin: een gesprek heeft ook STUN- en TURN-servers nodig, en groepsgesprekken hebben mediaservers nodig, zoals ons artikel over hoe groepsvideogesprekken werken uitlegt.
Of laat een realtime cloud de verbindingen vasthouden
De andere weg is een gehoste realtime dienst. De browsers houden hun open verbindingen met die dienst, niet met je hosting. Als er iets gebeurt op je website, stuurt WordPress één kort verzoek naar de dienst, en de dienst bezorgt het bij elke pagina die het moet krijgen. Je hosting beantwoordt alleen gewone verzoeken, zoals altijd.
WordPress blijft de plek waar je gegevens staan. De dienst vervoert alleen gebeurtenissen van de website naar de pagina’s en tussen pagina’s, dus aan hoe je website berichten, gebruikers of bestellingen opslaat, verandert niets.
Hoe WordPlus Cloud het doet voor WordPress
WordPlus Cloud for WordPress is die cloud, voor elke plugin op een WordPress-website:
- Niets te beheren. De realtime servers, de relay- en mediaservers voor gesprekken en de AI draaien in de cloud. Je website heeft alleen een abonnement nodig, met een prijs per website en geen limiet op leden of berichten.
- Elke plugin op de website kan het gebruiken. Better Messages en Live Stream gebruiken het meteen. Plugins gemaakt voor het Pusher-protocol maken verbinding met onze hosts en de sleutels van je website, en andere plugins, thema’s en eigen code maken verbinding via onze ontwikkelaars-API.
- Je gegevens blijven in WordPress. Gesprekken, leden en bestanden blijven in je database. Berichten gaan verzegeld door de cloud met een sleutel die je website heeft, zodat wij ze doorsturen zonder ze te lezen.
- Meer dan websockets. Hetzelfde abonnement geeft je gesprekken die altijd tot stand komen, groepsgesprekken, pushmeldingen naar browsers en telefoons, livestreaming, je eigen mobiele apps en AI, over dezelfde verbinding.
Een pagina houdt één verbinding, die alle plugins op de website delen, en die gaat zonder onderbreking naar een andere server als er een herstart. Je hosting doet weer waar die goed in is: verzoeken beantwoorden.
Bekijk WordPlus Cloud for WordPress, of de prijzen voor jouw aantal websites.