Websocketi u Laravelu bez pokretanja websocket poslužitelja

Uz Laravel ažuriranja uživo izgledaju jednostavno. Event implementira ShouldBroadcast, routes/channels.php određuje tko ga smije slušati, a Laravel Echo ga u pregledniku čuje. Narudžba se označi kao poslana, a kupac to vidi bez ponovnog učitavanja stranice.
Dokumentacija tek usput spominje da nešto mora držati vezu sa svakim otvorenim preglednikom. Sam Laravel odgovara na zahtjeve i staje, pa broadcasting uvijek treba websocket poslužitelj uz vašu aplikaciju. Ovaj članak objašnjava zašto, što je potrebno da ga pokrenete u produkciji i kako zadržati svoje evente i Echo točno onakvima kakvi jesu, dok veze umjesto vas drži oblak u stvarnom vremenu.
Zašto Laravel treba websocket poslužitelj
Zahtjev u Laravelu je kratak. PHP preuzme zahtjev, Laravel se pokrene, vaš kontroler odgovori, a proces je slobodan za sljedeći zahtjev. Zbog toga je Laravel brz i jednostavan za hosting, a to je i razlog zašto zahtjev ne može satima ostati otvoren kako bi jednom pregledniku slao ažuriranja.
Zato broadcasting ima dvije polovice:
- Vaša aplikacija šalje. Kad pozovete
broadcast( new OrderUpdated( $order ) ), Laravel preda event broadcasteru, koji ga prosljeđuje dalje u kratkom zahtjevu. UzShouldBroadcastto se odvija kao job u redu čekanja (queue), pa ga pokreće queue worker. - Nešto drugo isporučuje. Websocket poslužitelj drži otvorenu vezu sa svakim preglednikom, s vašom aplikacijom provjerava tko se smije pridružiti kojem privatnom kanalu i svaki event prosljeđuje preglednicima koji slušaju.
Prva polovica je običan Laravel. Druga je zasebna usluga koja stalno radi, i upravo tu leži posao.
Pokretanje vlastitog websocket poslužitelja
Laravel ima websocket poslužitelj koji možete sami pokrenuti, a imaju ga i drugi projekti. Na prijenosnom računalu pokrenut ćete ga za minutu. Za stvarne korisnike treba više:
- Proces koji stalno radi, pod upraviteljem procesa koji ga drži živim i ponovno pokreće kad se sruši, s vlastitim logovima i nadzorom. Na dijeljenom hostingu i serverless platformama takav se proces uopće ne može pokrenuti.
- Port, certifikat i proxy, kako bi se preglednici mogli spojiti preko
wss://na vašoj domeni, a proxy mora biti podešen tako da propušta websockete i ne prekida duge veze. - Mjesta za mnogo veza. Svaki otvoreni preglednik jedna je otvorena veza, a ograničenja poslužitelja i operacijskog sustava moraju biti podešena za tisuće njih istodobno.
- Više od jednog poslužitelja, kako rastete. Jedan poslužitelj jedna je točka na kojoj se mogu prekinuti sve veze. Dva ili više njih trebaju zajednički kanal, obično Redis, kako bi event poslan jednome stigao do preglednika spojenih na ostale.
- Deploy bez oluje. Ponovno pokretanje websocket poslužitelja prekida sve veze, a svi se preglednici odjednom ponovno spajaju. Stranice koje nisu bile spojene propuštaju i ono što je za to vrijeme poslano, osim ako im to nešto ne sačuva.
Ništa od toga nije egzotično i mnogi timovi to dobro rade. Ali to je drugi sustav koji treba održavati u radu uz vašu aplikaciju, dok god aplikacija ima funkcije uživo.
Ili neka veze drži oblak u stvarnom vremenu
Drugi je način hostana usluga kao vaš broadcaster. Vaša aplikacija svaki event šalje jednim kratkim HTTP zahtjevom, kao što to već radi s broadcasterom, a usluga drži veze, preko vaše aplikacije provjerava pravila vaših kanala i isporučuje evente. Vaša Laravel aplikacija ostaje obična Laravel aplikacija, na bilo kojem hostingu, uključujući serverless.
Važno je da promjena ostane unutar Laravelova broadcastinga, pa se vaši eventi, kanali i kod za Echo ne mijenjaju.
Laravel broadcasting na WordPlus Cloudu
S WordPlus Cloudom promjena se svodi na broadcasting konekciju. Navodi je vaš .env:
BROADCAST_CONNECTION=wordplus
WORDPLUS_SITE=s1500000007
WORDPLUS_SECRET=…
WORDPLUS_LOCAL_KEY=…Vaši kanali ostaju u routes/channels.php, uz jedan neobavezni argument za ono što svaka soba čuva:
// The room of an order, orders.1042, for its customer, the last 20 updates kept.
Broadcast::channel( 'orders.{order}', fn ( User $user, Order $order ) => $user->id === $order->customer_id, [ 'history' => 20 ] );Vaši eventi ostaju kakvi jesu, a šalje ih broadcast( new OrderUpdated( $order ) ). U pregledniku Echo umjesto svog uobičajenog konektora dobiva naš:
import Echo from 'laravel-echo';
import { WordplusConnector } from '@wordplus/realtime/echo';
window.Echo = new Echo( { broadcaster: WordplusConnector, ...window.wordplusRealtimeConfig } );
Echo.private( 'orders.1042' ).listen( '.updated', ( data ) => showStatus( data.status ) );Direktiva @wordplusRealtime u vašem layoutu ispisuje tu konfiguraciju, s prijavljenim korisnikom, pa se stranica spaja bez ikakvog prethodnog zahtjeva. Tada radi sve što znate iz rada s Echom:
- Privatni i presence kanali, s
here(),joining()ileaving()za to tko je u sobi,whisper()za prikaz tko upravo piše inotification()za Laravelove notifikacije. - Livewire čuje evente na isti način, s
#[On( 'echo-private:orders.{order.id},.updated' )]. - React i Vue koriste
useEcho()iz Laravelovih vlastitih Echo paketa, kao i starter kitovi. toOthers()preskače karticu koja je poslala zahtjev.
I ono što vam sam websocket poslužitelj ne daje:
- Nema websocket poslužitelja za održavanje. Veze drže naši poslužitelji, kako vaša aplikacija raste pokreću se novi, a stranica bez prekida prelazi s jednog na drugi kad se neki ponovno pokreće.
- Ništa se ne gubi pri ponovnom spajanju. Soba čuva svoje zadnje evente, pa stranica koja se vrati dobiva ono što je propustila, redom.
- Zapečaćeno na putu. Ono što vaša aplikacija šalje putuje šifrirano ključevima koje drže samo vaša aplikacija i vaši korisnici.
- Pozivi i prijenosi uživo na istoj vezi. Pozivi između dviju osoba, grupni pozivi i prijenosi uživo, s gotovim zaslonom poziva i playerom ili s vašim vlastitim.
Vodič za Laravel sadrži cijelo podešavanje, a demo uživo je mala trgovina izgrađena na njemu, u kojoj se narudžba, čim kliknete, u drugom prozoru označi kao poslana.
WordPlus Cloud for Apps ima cijenu prema istodobnim vezama, od 1.000 naviše, uz mjesečnu ili godišnju naplatu. Pogledajte što nudi aplikacijama ili cijene za aplikacije. Pitanja o vašoj integraciji? Pišite nam.