How to use Redis with Laravel

Photo by Emile Perron on Unsplash

PHP (Hypertext Preprocessor) on avoimen lähdekoodin skriptikieli, joka on suunniteltu sisäänrakennetuilla web-kehitysominaisuuksilla. Sitä on käytetty laajalti web-kehityksessä yli 20 vuoden ajan. Vaikka PHP:llä käytetään tällä hetkellä lähes 80 prosenttia verkkosivustoista, sillä on joitakin huomattavia heikkouksia. Yksi niistä on yksisäikeisyys.

PHP:ssä ei ole oletusarvoista ominaisuutta, jolla voitaisiin synnyttää lisäsäikeitä taustaprosesseja varten. Kielen yksisäikeisen rakenteen vuoksi sinun on vaikea rakentaa edes yksinkertaista verkkosovellusta, jonka on lähetettävä sähköposteja. Sähköpostin lähettäminen on kallis ja aikaa vievä prosessi, joka voi tukkia PHP:n yhden säikeen.

PHP-kehykset puuttuvat ongelmaan

PHP:llä on suuri määrä avoimen lähdekoodin kehyksiä. Niiden päätavoitteena on lyhentää monimutkaisten verkkosovellusten kehitysaikaa soveltamalla ennalta määriteltyjä käsitteitä. Ne auttavat PHP-kehittäjiä automatisoimaan tehtäviä, työskentelemään tehokkaasti erityyppisten tietokantojen kanssa, suojaamaan sovelluksia tunnetuilta haavoittuvuuksilta ja suorittamaan testausta. Suosituimpia kehyksiä ovat Laravel, Zend, Symfony ja Phalcon. Jokaisella niistä on omat etunsa ja valtava yhteisö, joka osallistuu avoimen lähdekoodin koodikannan kehittämiseen.

Jokainen kehys tarjoaa keinon kiertää PHP:n monisäikeisyysongelma. Jos halutaan, että prosessi suoritetaan taustalla, yleinen konsepti on seuraava: tiedot tehtävästä lähetetään jonoajuriin/viestiväylään samalla kun palvelin tarkistaa jatkuvasti tehtävälistaa nähdäkseen, onko siellä jotain suoritettavaa.

Find your next developer

Aloita tästä

Viestijonojen käsittely Laravelissa

Laravelissa on yhtenäinen jonotusliittymä, jonka avulla voit valita eri tekniikoiden, kuten Rediksen, Amazon SQS:n, Beanstalkdin tai jopa vanhanaikaisen relaatiotietokantajärjestelmän väliltä. Katsotaanpa, miten Laravel toimii Redisin kanssa, joka on avoimen lähdekoodin in-memory-tietorakennetallennus.

Mitä hyötyä Redisistä on Laravelissa? Käsitteellisesti työnnät tehtävän (tai "dispatching a job", kuten sitä kutsutaan Laravel-ekosysteemissä) Redis-jonoon, jossa se odottaa, kunnes se poimitaan ja käsitellään. Jonojen käsittelyä varten tarvitaan työntekijöitä, jotka toimivat keskeytyksettä. Tuotantopalvelimilla pitäisi olla Supervisor, Linux-ympäristöissä yleisesti käytetty prosessivalvoja.

Oletetaan, että sinulla on User-malli, jonka instanssi pitäisi luoda jokaista uutta rekisteröintiä varten. Tähän ei ole olemassa oletusarvoista tapaa: kaikki riippuu asetuksista. Toteuttaaksesi sen yksinkertaisesti, tarvitset tarkkailijan ja jonotetun työn:

Tarkkailija käynnistyy, kun mallin instanssi luodaan. Tarkkailija lähettää työn jonoon.

Valvoja pitää yllä queue:work-projektin käynnissä. Heti kun uusi työ lähetetään, Laravelin jonotyöläinen käsittelee sen.

Katsotaanpa koodiesimerkki.

Ensin sinun täytyy luoda tarkkailija User-mallille ja työ:

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

Seuraavaksi sinun täytyy esitellä juuri luomaasi sovellukseen. Voit tehdä sen rekisteröimällä havainnoitsijan EventServiceProviderissa seuraavasti:

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

Sovelluksellasi on nyt määritelmä siitä, mitä tarkkailla, ja sinun pitäisi konfiguroida se tekemään työ. UserObserverin on reagoitava, kun User-mallin instanssi luodaan. Voit saavuttaa tämän päivittämällä havainnoitsijan created-metodin kyseisen mallin osalta. Laitetaan se lähettämään sähköpostia 10 sekuntia mallin instanssin luomisen jälkeen, jotta nähdään, miten se toimii käytännössä.

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

Aina kun User luodaan, tarkkailija lähettää SendRegistrationEmail-tehtävän.

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('Tervetuloa sovellukseen!');
});
}); }
}

Näin toteutetaan virtaus. Nyt sovellus lähettää sähköpostin uudelle käyttäjälle rekisteröitymisen yhteydessä.

Jotta se toimisi jonojen kautta, sinun täytyy päivittää määritykset käyttämään Redis ajuria. Kun olet asentanut Rediksen koneellesi, riittää, että päivität .env:ssä kerran:

QUEUE_CONNECTION=redis

Sen jälkeen älä unohda päivittää konfiguraatioita: php artisan config:cache. Käynnistääksesi Laravelin jonotyöläisen sinun on suoritettava php artisan queue:work.

Ongelmien ratkaiseminen Laravelin jonotyöläisten kanssa

Tuotantoympäristöt edellyttävät, että työläiset ovat käynnissä koko ajan. queue:work-komento itsessään voi epäonnistua monista syistä, kuten maksimiaikakatkaisun ylittymisestä. Palvelimen tarkistaminen manuaalisesti varmistaaksesi, että jonotyöläinen on toiminnassa, ei ole vaihtoehto. Sen sijaan käytät Supervisoria, Linux-ympäristöjen prosessimonitoria.

Kun olet asentanut Supervisorin palvelimelle, sinun on annettava sille konfigurointitiedosto, jotta se voi toimia vuorovaikutuksessa Laravelin jonotyöläisten kanssa. Luodaan laravel-worker.conf-tiedosto, joka käsittelee queue:work-prosessia.

[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

Tässä konfiguraatiossa sinun pitäisi kertoa Supervisorille, että se käynnistää työläiset automaattisesti uudelleen ja 4 rinnakkaista prosessia on käynnissä. Käynnistetään prosessit:

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

Loppujen lopuksi tämä on niin yksinkertaista kuin luit. Supervisor pitää workerit käynnissä. Aina kun jonoon tulee työ, työntekijät valitsevat ja suorittavat sen. Näin varmistat, että käyttäjän ei tarvitse odottaa, kunnes PHP käsittelee sähköpostin lähetystehtävän ja siirtyy seuraavalle sivulle siirtämällä tämän aikaa vievän työn "rinnakkaisiin" säikeisiin.

Löydä seuraava kehittäjäsi päivien, ei kuukausien sisällä

Kun otat yhteyttä, järjestämme lyhyen 25 minuuttia kestävän tapaamisen, jonka aikana:

  • Kartoitamme yrityksenne kehitystarvetta
  • Kertoa prosessimme, jolla löydämme teille pätevän, ennakkotarkastetun kehittäjän verkostostamme
  • Käymme läpi askeleet, joilla oikea ehdokas pääsee aloittamaan – useimmiten viikon sisällä

Keskustele kanssamme