Zašto WordPress ne može držati websocket i što učiniti umjesto toga

Prije ili kasnije WordPress web-stranica poželi da se nešto događa uživo: nova poruka koja se pojavi bez ponovnog učitavanja, obavijest u trenutku kad stigne narudžba, broj ljudi koji su na mreži, poziv koji zvoni. Alat za to na webu je websocket, veza između preglednika i poslužitelja koja ostaje otvorena, pa poslužitelj može javiti čim se nešto dogodi.
Tada dolazi iznenađenje: WordPress nema websocket poslužitelj, a hosting na kojem radi ne može ga pokrenuti. Ovaj članak objašnjava zašto, što web-stranice obično rade u vezi s tim i koliko košta pokretanje vlastitog websocket poslužitelja.
WordPress odgovara na zahtjev i staje
Svaka stranica WordPressa, svaki poziv REST API-ja i svaki admin-ajax zahtjev rade na isti način. Web-poslužitelj predaje zahtjev PHP-u, PHP učitava WordPress s njegovim dodacima i temom, sastavlja odgovor, šalje ga i staje. Sljedeći zahtjev opet počinje od nule.
Taj je model razlog zašto WordPress radi gotovo svugdje. On je i razlog zašto ne može držati websocket. Websocket nije jedan zahtjev, nego veza koja ostaje otvorena dok god je otvorena i stranica, često satima. Da bi je držao, WordPress bi trebao po jedan PHP proces za svaku otvorenu stranicu, koji većinu vremena ne bi radio ništa, a hosting web-stranici daje samo malen broj PHP procesa, dovoljan za zahtjeve koji završe u djeliću sekunde. Šačica posjetitelja s otvorenom stranicom zauzela bi ih sve, a web-stranica bi prestala odgovarati svima ostalima.
Pružatelji hostinga štite se od toga. Prekidaju zahtjeve koji traju predugo, često nakon 30 do 60 sekundi, a na većini paketa web-stranici ne dopuštaju da u pozadini pokrene vlastiti proces ni da mu otvori port. Čak i ondje gdje hosting to dopušta, poslužitelj ispred PHP-a i svaki proxy ispred tog poslužitelja moraju biti podešeni tako da propuštaju websocket.
Polling: pitati iznova i iznova
Uobičajeno zaobilazno rješenje je polling. Stranica svakih nekoliko sekundi pita poslužitelj: „ima li što novo?“ Najčešće je odgovor: nema.
Svako od tih pitanja cijeli je WordPress zahtjev: PHP se pokreće, učitava WordPress i njegove dodatke, šalje upite bazi podataka i odgovara. S 50 posjetitelja na stranici koja pita svakih 5 sekundi to je 10 punih WordPress zahtjeva u sekundi, svake sekunde, i to većinom uzalud. Pitate li rjeđe, web-stranica djeluje sporo, a poruci treba pola minute da se pojavi. Pitate li češće, hosting se počne mučiti ili vam pošalje upozorenje o potrošnji resursa.
WordPress ima i vlastitu inačicu toga, Heartbeat API, koji pita svakih 15 do 60 sekundi. Dovoljan je za spremanje skica i prikaz tko uređuje objavu. Za chat ili poziv daleko je prespor.
Long polling i server-sent events, kod kojih poslužitelj drži zahtjev otvorenim dok se nešto ne dogodi, izgledaju kao rješenje. Na WordPressu to nisu: svaki zahtjev koji čeka drži jedan PHP proces, pa nailaze ravno na isto ograničenje kao i websocket.
Vlastiti websocket poslužitelj
Pravo rješenje je poslužitelj napravljen za držanje mnogo otvorenih veza, uz WordPress, a ne unutar njega. Mnogi ga timovi grade. Što je za to potrebno:
- Zaseban poslužitelj, obično mali virtualni poslužitelj s Node.js-om ili drugim izvršnim okruženjem napravljenim za duge veze, s vlastitim ažuriranjima i nadzorom.
- Certifikat i proxy, kako bi se preglednik mogao spojiti preko
wss://na vašoj domeni. - Poznavanje vaših korisnika. Websocket poslužitelj ne vidi prijavu u WordPress, pa vaša web-stranica mora svakoj stranici dati potpisani token, a poslužitelj ga mora provjeriti i odlučiti tko se smije pridružiti kojem kanalu.
- Način slanja iz WordPressa. Kad se nešto dogodi u WordPressu, hook o tome mora javiti websocket poslužitelju, koji to zatim šalje pravim preglednicima.
- Više od jednog, kako rastete. Jedan poslužitelj jedna je točka na kojoj se mogu prekinuti sve veze. Dva ili više njih trebaju način da međusobno dijele poruke, a stranice se moraju glatko ponovno spojiti kad se poslužitelj ponovno pokrene.
Ništa od toga nije egzotično, ali to je drugi sustav koji treba održavati u radu uz WordPress, dok god web-stranica ima funkcije uživo. Za pozive je to tek početak: poziv treba i STUN i TURN poslužitelje, a grupni pozivi i medijske poslužitelje, kako objašnjava naš članak o tome kako rade grupni videopozivi.
Ili neka veze drži oblak u stvarnom vremenu
Drugi je način hostana usluga za rad u stvarnom vremenu. Preglednici drže otvorene veze s uslugom, a ne s vašim hostingom. Kad se na vašoj web-stranici nešto dogodi, WordPress o tome usluzi pošalje jedan kratak zahtjev, a usluga događaj isporuči svakoj stranici koja ga treba dobiti. Vaš hosting odgovara samo na obične zahtjeve, kao i dosad.
WordPress ostaje mjesto na kojem žive vaši podaci. Usluga samo prenosi događaje s web-stranice do stranica u preglednicima i između tih stranica, pa se ništa ne mijenja u tome kako vaša web-stranica sprema objave, korisnike ili narudžbe.
Kako to WordPlus Cloud radi za WordPress
WordPlus Cloud for WordPress upravo je taj oblak, za svaki dodatak na WordPress web-stranici:
- Ništa ne morate održavati. Poslužitelji za rad u stvarnom vremenu, releji za pozive, medijski poslužitelji i AI rade u oblaku. Vašoj web-stranici potrebna je samo pretplata, s cijenom po web-stranici, bez ograničenja broja članova ili poruka.
- Može ga koristiti svaki dodatak na web-stranici. Better Messages i Live Stream koriste ga bez dodatnog podešavanja. Dodaci izrađeni za protokol Pusher povezuju se s našim poslužiteljima i ključevima vaše web-stranice, a svaki drugi dodatak, tema ili prilagođeni kod povezuje se preko našeg API-ja za razvojne programere.
- Vaši podaci ostaju u WordPressu. Razgovori, članovi i datoteke ostaju u vašoj bazi podataka. Poruke prolaze kroz oblak zapečaćene ključem koji drži vaša web-stranica, pa ih prosljeđujemo bez čitanja.
- Više od websocketa. Ista pretplata donosi pozive koji se uvijek spajaju, grupne pozive, push obavijesti u preglednike i na mobitele, prijenos uživo, vlastite mobilne aplikacije i AI, na istoj vezi.
Stranica drži jednu vezu, koju dijele svi dodaci na web-stranici, a ta veza bez prekida prelazi na drugi poslužitelj kad se neki ponovno pokrene. Vaš se hosting vraća onome što dobro radi: odgovaranju na zahtjeve.
Pogledajte WordPlus Cloud for WordPress ili cijene za vaš broj web-stranica.