Skip to content

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.
  • database använder databasen för att lagra jobben.
  • redis använder Redis för att lagra jobben.
  • sqs använder Amazon SQS för att lagra jobben.
  • beanstalkd använder Beanstalkd för att lagra jobben.
  • null kastar 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:

shell
wp dusk make:job SendEmail

I 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
<?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.

php
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:

shell
wp dusk queue:work

Den 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:work som körs i bakgrunden.
  • Ställ in QUEUE_CONNECTION i .env till vald backend.
  • Om database ska användas behöver databastabellerna skapas med wp 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.

shell
wp dusk queue:setup

Efter det ställer vi in rätt QUEUE_CONNECTION i sidans .env fil.

dotenv
QUEUE_CONNECTION=database

Nu 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.

Exempel på background process

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.

shell
cachetool opcache:reset
wp dusk queue:restart