How to use Redis with Laravel

Photo by Emile Perron on Unsplash

PHP (Hypertext Preprocessor) er et skriptspråk med åpen kildekode som ble utviklet med innebygde funksjoner for webutvikling. Det har vært mye brukt i webutvikling i over 20 år. Selv om det i dag brukes på nesten 80 % av alle nettsteder, har PHP noen betydelige svakheter. En av dem er at det er enkelttrådet.

PHP har ikke en standardfunksjon for å opprette flere tråder for bakgrunnsprosesser. På grunn av språkets enkelttrådede design, vil det være vanskelig å bygge selv en enkel webapplikasjon som skal sende e-post. Å sende en e-post er en kostbar og tidkrevende prosess som kan blokkere PHP-enkelttråden.

PHP-rammeverk løser problemet

PHP har et stort antall rammeverk med åpen kildekode. Hovedmålet deres er å redusere utviklingstiden for komplekse webapplikasjoner ved å bruke forhåndsdefinerte konsepter. De hjelper PHP-utviklere med å automatisere oppgaver, arbeide effektivt med ulike typer databaser, beskytte applikasjoner mot velkjente sårbarheter og utføre testing. De mest populære rammeverkene er Laravel, Zend, Symfony og Phalcon. Hvert av dem har sine egne fordeler og et stort fellesskap som bidrar til kodebasen med åpen kildekode.

Alle rammeverkene tilbyr en måte å omgå problemet med multi-threading i PHP. Hvis du vil ha en prosess som kjører i bakgrunnen, er det generelle konseptet følgende: informasjonen om en oppgave sendes til en kø-driver/meldingsbuss mens serveren hele tiden sjekker listen over oppgaver for å se om det er noe som skal kjøres.

Find your next developer

Kom igang

Håndtering av meldingskøer i Laravel

Laravel har et enhetlig kø-API som lar deg velge mellom ulike teknologier som Redis, Amazon SQS, Beanstalkd eller til og med et gammeldags relasjonsdatabasesystem. La oss se på hvordan Laravel fungerer med Redis, en åpen kildekode-lagring av datastrukturer i minnet.

Hva er bruken av Redis i Laravel? Konseptuelt sett sender du en oppgave (eller "dispatching a job", som det kalles i Laravel-økosystemet) til Redis-køen, der den venter til den blir plukket ut og behandlet. For å behandle køer må du ha arbeidere som kjører non-stop. På produksjonsservere bør du ha en Supervisor, en prosessovervåker som ofte brukes i Linux-miljøer.

La oss si at du har en User-modell, som det skal opprettes en instans av for hver nye registrering. Det finnes ingen standard måte å oppnå dette på: alt handler om preferanser. For å implementere det enkelt trenger du en observatør og en jobb i kø:

Observatøren utløses når en forekomst av modellen opprettes. Observatøren sender jobben til køen.

Supervisoren fortsetter å kjøre queue:work for prosjektet. Så snart en ny jobb sendes ut, vil den bli behandlet av Laravels køarbeider.

La oss se på et kodeeksempel.

Først må du opprette en observatør for User-modellen og en jobb:

php artisan make:observer UserObserver --model=User
php artisan make:job SendRegistrationEmail

Deretter må du introdusere det du nettopp har opprettet i applikasjonen. Du kan gjøre det ved å registrere en observatør i EventServiceProvider på følgende måte:

namespace App\Providers;
class EventServiceProvider extends ServiceProvider 
{
public function boot()
{
User::observe(UserObserver::class);
        } }
}

Applikasjonen din har nå en definisjon av hva som skal observeres, og du bør konfigurere den til å gjøre jobben. UserObserver må reagere når en instans av User-modellen opprettes. Det kan du oppnå ved å oppdatere created-metoden til observatøren for den relaterte modellen. La oss få den til å sende en e-post 10 sekunder etter at modellforekomsten er opprettet for å se hvordan det fungerer i praksis.

namespace App\Observers;
class UserObserver
{
public function created(User $user)
{
SendRegistrationEmail::dispatch($user->email)->delay(now()->addSeconds(10));
} } } }
}

Hver gang en User opprettes, vil jobben SendRegistrationEmail bli sendt ut av observatøren.

namespace App\Jobs;
class SendRegistrationEmail implements ShouldQueue
{
    public $email;
    public function __construct($email)
{
$this->email = $email;
}
public function handle()
{
    $email = $this->email;
Mail::send([], [], function ($message) use ($email) 
{ 
$message
->to($email)
->subject('Hello, world!')
->setBody('Velkommen til applikasjonen!');
});
} }
}

Slik implementerer du flyten. Nå sender applikasjonen en e-post til en ny bruker ved registrering.

For å få det til å fungere via køer, må du oppdatere konfigurasjonene slik at de bruker Redis-driveren. Etter at du har installert Redis på maskinen din, er det nok å oppdatere i .env én gang:

QUEUE_CONNECTION=redis

Etterpå må du ikke glemme å oppdatere konfigurasjonene dine: php artisan config:cache. For å starte Laravels køarbeider, må du kjøre php artisan queue:work.

Løsning av problemer med Laravels køarbeidere

Produksjonsmiljøer krever at du har arbeiderne i gang hele tiden. Selve kommandoen queue:work kan mislykkes av mange grunner, for eksempel fordi den maksimale tidsavbruddet overskrides. Det er ikke et alternativ å sjekke serveren manuelt for å forsikre seg om at køarbeideren er oppe. I stedet bruker du Supervisor, en prosessovervåker for Linux-miljøer.

Etter at du har installert Supervisor på serveren, må du gi den en konfigurasjonsfil slik at den kan samhandle med Laravels køarbeidere. La oss opprette en laravel-worker.conf-fil som håndterer queue:work-prosessen.

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/project/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=root
numprocs=4
redirect_stderr=true
stdout_logfile=/home/project/logs/worker.log
stopwaitsecs=3600

I denne konfigurasjonen skal du be Supervisor om å starte arbeiderne på nytt automatisk og ha 4 parallelle prosesser i gang. La oss starte prosessene:

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start laravel-worker:*

Avslutningsvis, dette er så enkelt som du leser det. Supervisoren vil holde arbeiderne i gang. Hver gang køen får en jobb, vil arbeiderne velge og kjøre den. På denne måten sikrer du at brukeren ikke trenger å vente til PHP behandler oppgaven med å sende en e-post og går videre til neste side ved å flytte denne tidkrevende jobben til "parallelle" tråder.

Finn din neste utvikler innen dager, ikke måneder

I løpet av en kort 25-minutters samtale ønsker vi å:

  • Forstå dine utviklingsbehov
  • Forklare prosessen vår der vi matcher deg med kvalifiserte, evaluerte utviklere fra vårt nettverk
  • Dele de neste stegene for å finne riktig match, ofte på mindre enn en uke

La oss ta en prat