Blog

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

· Andrij Tkachenko · 5 min čitanja

Prozor web-stranice na njezinu poslužitelju, spojen jednom linijom s oblakom koji drži otvorene veze pet prozora preglednika

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.