Köer
Ibland behöver man köra lång-körande processer, exempelvis att skicka många mejl eller läsa CSV filer, som tar för lång tid för vanliga webbanrop. Då kan det vara bra att skicka iväg processen till en kö för att hantera det i bakgrunden. Det betyder att användaren inte behöver sitta och vänta på att processen blir klar innan de kan fortsätta använda webbsidan.
Notera
Kösystemet kräver Dusk 2.6.0 eller högre.
Processer som skickas in till kön kallas för "jobb".
Kösystemet kommer från Laravel och har ett enhetligt API för att hantera köer oavsett vad som används som underliggande backend.
syncär en synkronisk kö, dvs. köade jobb hanteras inte i bakgrunden. Främst användbar för lokal utveckling.databaseanvänder databasen för att lagra jobben.redisanvänder Redis för att lagra jobben.sqsanvänder Amazon SQS för att lagra jobben.beanstalkdanvänder Beanstalkd för att lagra jobben.nullkastar samtliga jobb utan att hantera dem.
sync används som standard.
Varning
Den här dokumentationen är en grundläggande introduktion to kösystemet. För mer komplett och detaljerad dokumentat, se Laravels dokumentation.
Skapa jobb
Jobb är klasserna som enkapsulerar en åtgärd som man vill lägga till och köra genom kön.
För att skapa jobb kan man använda följande kommando:
wp dusk make:job SendEmailI detta exempel kommer filen app/Jobs/SendEmail.php att skapas. Om mappen app/Jobs inte finns kommer den skapas.
Struktur
Jobbklasser har en simpel struktur, det enda som krävs är en handle metod, men om man ska ta emot parametrar gör man det i klassens konstruktor.
Här är ett simpelt exempel på ett jobb som skickar mejl.
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
class SendEmail implements ShouldQueue
{
use Dispatchable;
use InteractsWithQueue;
use Queueable;
use SerializesModels;
/**
* Create a new job instance.
*/
public function __construct(public string $to, public string $message)
{
//
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
wp_mail($this->to, "Ett mejl från Horizon", $this->message);
}
}I detta exempel tar vi emot en epostadress ($to) och ett meddelande ($message).
Skicka jobb
För att skicka ett jobb används den statiska metoden dispatch på jobbklassen.
use App\Jobs\SendEmail;
$user = wp_get_current_user();
SendEmail::dispatch(
$user->user_email,
'Det här är ett mejl som vi skickar från Horizon. Välkommen!'
);WordPress actions och köer
När man kör en do_action körs det synkroniskt, i Dusk finns funktionen enqueue_action, som ser ut som do_action men lägger istället till actionanropet i konfigurerad kö.
Notera
Om enqueue_action mot förmodan skulle vara överskriven av något plugin eller WordPress Core finns funktionen också namespacead som Nobox\enqueue_action.
Köhantering
Konfiguration
Kösystemet kan konfigureras i filen config/queue.php. De flesta alternativen kan konfigureras genom .env.
Oftast är det QUEUE_CONNECTION som behöver ändras.
Bearbeta köer
Om du använder sync som backend behövs det ingen konfiguration eftersom jobben körs direkt.
För alla andra backends behövs det en så kallad "köarbetare" ("queue worker"). Denna startar du med följande kommando:
wp dusk queue:workDen kommer bevaka den inställda anslutningen och automatisk hantera jobb som kommer in där.
Deploy
Här är en checklista över det som behövs för att komma igång med köer i produktion.
- Sätt upp en queue worker med
wp dusk queue:worksom körs i bakgrunden. - Ställ in
QUEUE_CONNECTIONi.envtill vald backend. - Om
databaseska användas behöver databastabellerna skapas medwp dusk queue:setup.
Exempel
Vi kör database som backend, så vi ansluter till servern med SSH och kör kommandot för att sätta upp databastabellerna.
wp dusk queue:setupEfter det ställer vi in rätt QUEUE_CONNECTION i sidans .env fil.
QUEUE_CONNECTION=databaseNu ska vi sätta upp en queue worker. Vår server hanteras med Laravel Forge, och där kallas detta en "background process". Dessa hittar du inne på en sida på en servern under Processes -> Background processes.
"Name" kan du sätta till något beskrivande, ex. "Köarbetare" eller dyl.
"Command" sätter du till wp dusk queue:work.
Se till att "Supervisor configuration" pekar till sidans hemkatalog, ex. /home/forge/nobox.se. Resten av inställningarna behöver du oftast inte röra.

Nu har vi allt som behövs för grundläggande köhantering, men vi kommer behöva manuellt starta om köarbetaren om vi gör en deploy som ändrar PHP kod.
Eftersom vi har satt upp köarbetaren som en background process (som i sin tur använder Supervisor) kan vi skicka en signal som säger till körabetaren att stänga av sig själv, vilket i sin tur kommer göra så att Supervisor startar processen igen.
I detta exempel skickar vi signalen i samband med att vi startar om OPcache i vår Buddy pipeline.
cachetool opcache:reset
wp dusk queue:restart