How to use Redis with Laravel

Foto af Emile Perron på Unsplash

PHP (Hypertext Preprocessor) er et open source-scriptingsprog, der blev designet med indbyggede webudviklingsfunktioner. Det er blevet brugt i vid udstrækning til webudvikling i over 20 år. Selv om det i øjeblikket driver næsten 80 % af alle hjemmesider, har PHP nogle væsentlige svagheder. At være single-threaded er en af dem.

PHP har ikke en standardfunktion til at skabe ekstra tråde til baggrundsprocesser. På grund af sprogets enkelttrådede design vil du have svært ved at bygge selv en simpel webapplikation, der skal sende e-mails. At sende en e-mail er en dyr og tidskrævende proces, der kan blokere den enkelte PHP-tråd.

PHP-frameworks løser problemet

PHP har et stort antal open source-frameworks. Deres hovedmål er at reducere udviklingstiden for komplekse webapplikationer ved at anvende foruddefinerede koncepter. De hjælper PHP-udviklere med at automatisere opgaver, arbejde effektivt med forskellige typer databaser, beskytte applikationer mod velkendte sårbarheder og udføre test. De mest populære frameworks er Laravel, Zend, Symfony og Phalcon. Hver af dem har sine egne fordele og et stort fællesskab, der bidrager til open source-kodebasen.

Hvert framework tilbyder en vej rundt om problemet med multi-threading i PHP. Hvis du vil have en proces til at køre i baggrunden, er det generelle koncept følgende: Oplysningerne om en opgave sendes til en kø-driver/meddelelsesbus, mens serveren konstant tjekker listen over opgaver for at se, om der er noget, der skal udføres.

Find din næste udvikler

Kom i gang

Håndtering af beskedkøer i Laravel

Laravel har et samlet kø-API, der giver dig mulighed for at vælge mellem forskellige teknologier som Redis, Amazon SQS, Beanstalkd eller endda et gammeldags relationelt databasesystem. Lad os se på, hvordan Laravel fungerer med Redis, en open source in-memory datastrukturlagring.

Hvad kan man bruge Redis til i Laravel? Konceptuelt skubber du en opgave (eller "sender et job", som det kaldes i Laravel-økosystemet) til Redis-køen, hvor den venter, indtil den bliver plukket og behandlet. For at behandle køer skal du have arbejdere, der kører non-stop. På produktionsservere bør du have en Supervisor, en procesovervågning, der ofte bruges i Linux-miljøer.

Lad os sige, at du har en User-model, som der skal oprettes en instans af for hver ny registrering. Der er ingen standardmåde at opnå dette på: Det handler om præferencer. For at implementere det enkelt skal du bruge en observatør og et job i kø:

Observatøren udløses, når der oprettes en instans af modellen. Observatøren sender jobbet til køen.

Supervisoren fortsætter med at køre queue:work for projektet. Så snart et nyt job sendes, vil det blive behandlet af Laravels køarbejder.

Lad os se på et kodeeksempel.

Først skal du oprette en observatør til User-modellen og et job:

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

Dernæst skal du introducere det, du lige har oprettet, i applikationen. Det kan du gøre ved at registrere en observatør i EventServiceProvider på følgende måde:

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

Din applikation har nu en definition af, hvad der skal observeres, og du bør konfigurere den til at udføre jobbet. UserObserver skal reagere, når der oprettes en instans af User-modellen. Det kan du opnå ved at opdatere observatørens created-metode for den relaterede model. Lad os få den til at sende en e-mail 10 sekunder efter, at modelinstansen er oprettet, for at 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 oprettes, vil SendRegistrationEmail-jobbet blive sendt af sted af 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 applikationen!');
});
}
}

Sådan implementerer du flowet. Nu sender applikationen en e-mail til en ny bruger ved registrering.

For at få det til at fungere via køer skal du opdatere konfigurationerne, så de bruger Redis-driveren. Når du har installeret Redis på din maskine, er det nok at opdatere i .env én gang:

QUEUE_CONNECTION=redis

Glem ikke at opdatere dine konfigurationer bagefter: php artisan config:cache. For at starte Laravels køarbejder skal du køre php artisan queue:work.

Løsning af problemer med Laravels køarbejdere

Produktionsmiljøer kræver, at du har arbejderne kørende hele tiden. Selve kommandoen queue:work kan fejle af mange årsager, f.eks. overskridelse af den maksimale timeout. Det er ikke en mulighed at tjekke serveren manuelt for at sikre, at køarbejderen er oppe. I stedet skal du bruge Supervisor, en procesmonitor til Linux-miljøer.

Når du har installeret Supervisor på serveren, skal du give den en konfigurationsfil, så den kan interagere med Laravels køarbejdere. Lad os oprette en laravel-worker.conf-fil, der håndterer queue:work-processen.

[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 konfiguration skal du bede Supervisor om at genstarte arbejderne automatisk og have 4 parallelle processer kørende. Lad os starte processerne:

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

Konklusionen er, at det er lige så enkelt, som du læser det. Supervisoren holder arbejderne kørende. Hver gang køen får et job, vil arbejderne vælge og køre det. På den måde sikrer du, at brugeren ikke behøver at vente på, at PHP behandler opgaven med at sende en e-mail og går videre til næste side ved at flytte dette tidskrævende job til 'parallelle' tråde.

Find din næste udvikler inden for få dage, ikke måneder

Book en 25-minutters samtale, hvor vi:

  • udfører behovsafdækning med fokus på udviklingsopgaver
  • Forklar vores proces, hvor vi matcher dig med kvalificerede, godkendte udviklere fra vores netværk
  • beskriver de næste trin for at finde det perfekte match på få dage

Lad os snakke om det