Um eine Laravel-Queue zu erstellen, die eine E-Mail verschickt, müssen zunächst einmal alle Anforderungen für Laravel und anschließend ein neues Laravel Projekt auf deinem Rechner erstellt worden sein. Wir wollen in diesem Beispiel per Job eine Mail verschicken. Diesen Job können wir dann in die Queue (Warteschlange) packen.

Vorbereitungen

Um eine Queue abfeuern zu können braucht es in unserem Beispiel eine Queue Table. Klar gibt es auch Redis & co., aber wir speichern jetzt die künftig noch abzuarbeitenden Jobs in einer ganz normalen Datenbank Tabelle. Hierzu brauchen wir die Migration, welche durch Artisan erstellt wird:

php artisan queue:table

Die neu erstellte Migration Datei sieht wie folgt aus:

class CreateJobsTable extends Migration{

    // this method will create a database called jobs with its respective columns
    public function up(){
        Schema::create('jobs', function (Blueprint $table) { //we define our database columns here
            $table->bigIncrements('id');
            $table->string('queue')->index();
            $table->longText('payload');
            $table->unsignedTinyInteger('attempts');
            $table->unsignedInteger('reserved_at')->nullable();
            $table->unsignedInteger('available_at');
            $table->unsignedInteger('created_at');
        });
    }

    // this method is used to check if the table already exists
    public function down(){
        Schema::dropIfExists('jobs');
    }
}

Nun müssen wir Laravel in der `.env` Datei noch mitteilen, dass wir Database als Treiber nutzen möchten.

Bitte stelle sicher, dass Du die .env Datei auch mit korrekten Datenbankeinstellungen ausfüllst, sonst klappt die Migration nicht
QUEUE_CONNECTION=database

Jetzt ist alles so weit vorbereitet, sodass wir die Migration ausführen können, um die Jobs Tabelle anzulegen.

php artisan migrate

Migration table created successfully.
--------
Migrating: 2023_02_12_161847_create_jobs_table
Migrated:  2023_02_12_161847_create_jobs_table (67.36ms)

Queue einrichten

Zunächst musst Du die Laravel-Queue-Konfiguration richtig einrichten. Dazu brauchst Du einen passenden Queue-Manager und einen unterstützten Treiber wie zum Beispiel Redis oder Database. Wir haben uns oben für Database entschieden.

Lokales Testing

Die Queue läuft lokal ganz einfach mit einem Befehl:

php artisan queue:work --queue=high,default

Dies arbeitet die “Warteschlange” mit Priorität “high” und “default” ab. Der PHP Prozess läuft ununterbrochen, bis Du ihn beendest. Heißt also, dass er stets darauf “hört”, ob im verwendeten Queue Treiber (also hier Database) ein neuer Eintrag abzuarbeiten ist. Wenn ein neuer Eintrag vorhanden ist, beginnt der Prozess und Artisan führt die handle() Funktion wie gewohnt im Laravel app Context aus. Die Konsole sollte nun ungefähr folgendes zeigen:

php artisan queue:work --queue=high,default

  INFO   Processing jobs from the high,default queues.

Das heißt, dass jetzt Artisan darauf wartet, bis ein Job in deiner Anwendung abgefeuert (engl. dispatch) wird. Doch möchtest Du unter Umständen auf einem Server kein Artisan händisch starten. Dafür gibt es sogenannte Daemons wie zum Beispiel supervisor.

Laravel Queue auf Ubuntu Servern mit supervisor

Projekt vorbereiten und installieren

Installiere die erforderlichen Pakete auf deinem Ubuntu-Server, um sicherzustellen, dass du alles hast, was du brauchst, um die Laravel-Queue auszuführen. Öffne dazu dein Terminal und führe den folgenden Befehl aus:

sudo apt-get install php-cli php-mbstring git supervisor

Wenn Du noch keinen Composer auf deinem Ubuntu Server hast, dann hole dies entsprechend mit folgenden Befehlen nach:

curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

Installiere nun dein Projekt, indem Du es per git klonst (oder via FTP entpackst). Merke dir den Pfad wohin Du es entpackst. Ich empfehle Dir künftig übrigens unbedingt die Nutzung von git, da Du später auch mit CI/CD Pipelines ein kontinuierliches Erlebnis schaffen kannst ohne Downtimes und mit einer guten Testabdeckung. Stelle sicher, dass Du dein Projekt nun mit composer install installiert hast und und php artisan keinen Fehler auswirft.

Supervisord Config File für Laravel Jobs

Der Supervisor Daemon (kurz supervisord) ist wie in sämtlichen mystischen Filmen ein immer anwesendes Wesen. Er soll ja auch immer da sein und dafür sorgen, dass das PHP Artisan Queue Script neu startet, wenn es denn mal abstürzen sollte. Erstelle also nun eine Konfigurationsdatei für den Supervisor-Daemon, indem du den folgenden Befehl ausführst (gerne auch mit Vi oder Vim statt nano).

sudo nano /etc/supervisor/conf.d/laravel-worker.conf

Die Config Datei sollte nun folgenden Inhalt haben, natürlich angepasst auf die Pfade deines Projekts!

[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /pfad/zu/deinem/laravel/projekt/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/laravel-worker.log

Achte darauf, den Pfad zum Laravel-Projekt in der Befehlszeile unter command zu ersetzen und den Benutzernamen unter user entsprechend anzupassen. Speichere dann die Datei und verlasse den Editor.

Den Daemon starten

Wenn Du nun alles vorbereitet hast, kannst Du den Daemon starten indem Du folgendes in die Konsole eingibst:

sudo supervisorctl reread
sudo supervisorctl update

Der erste Befehl liest die Supervisor Konfigurationen neu ein, und der zweite startet quasi neu. Um zu sehen ob alles schon läuft gibt es den Status Befehl:

sudo supervisorctl status

Wenn Du alles richtig gemacht hast, sollte dein Output ungefähr wie folgt sein:

laravel-worker:laravel-worker_00   RUNNING   pid 9876, uptime 0:11:11

Das bedeutet, dass der Daemon läuft und auf neue Jobs wartet, die der Queue hinzugefügt wurden. Und das ist dann auch schon alles! Du hast nun die Laravel-Queue auf deinem Ubuntu-Server mit einem Daemon eingerichtet und kannst Jobs in der Queue ausführen lassen.

Du bist eher so der Video Typ?

Wir haben Dir auf unserem CoderCampus alles Wichtige was Du brauchst für das Lernen von Laravel bereitgestellt.

Job erstellen

Erstelle eine neue Art von Job-Klasse, indem Du mit Artisan einen Job erstellst. Führe also php artisan make:job  in der Konsole aus. Gib dem Job den NamenSendMailJob, sodass der ganze Befehl wie folgt lautet: php artisan make:job SendMailJob

Jetzt brauchen wir die Logik. Das was ein Job ausführen soll wird in seiner “handle()” Methode geregelt. Jetzt implementieren wir also die Logik zum Versenden der E-Mail in der handle()-Methode der Job-Klasse. Mails verschicken wir mithilfe der Laravel-Mail-Klasse. Wir bräuchten für den Inhalt der Mail zusätzlich noch eine Blade Datei, zu erkennen am Code 'emails.welcome'. Diese Datei legst Du unter /resources/views/emails/welcome.blade.php an.

use Illuminate\Mail\Message;
use Illuminate\Support\Facades\Mail;

class SendMailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $recipient;
    protected $subject;

    public function __construct($recipient, $subject)
    {
        $this->recipient = $recipient;
        $this->subject = $subject;
    }

    public function handle()
    {
        Mail::send('emails.welcome', [], function (Message $message) {
            $message->to($this->recipient)
                ->subject($this->subject);
        });
    }
}

In diesem Beispiel wird die SendMailJob-Klasse definiert und zwei Parameter $recipient und $subject im Konstruktor akzeptiert. Die handle()-Methode verwendet dann die Laravel-Mail-Klasse, um eine E-Mail zu erstellen und an den angegebenen Empfänger mit dem angegebenen Betreff zu senden.

Wichtig ist auch zu erwähnen, dass durch die Traits use Dispatchable, InteractsWithQueue, Queueable der Job erst Queue-fähig wird.

Den Job aufrufen

Jobs werden aufgerufen, abgeschickt oder erledigt (engl. dispatch). Wir feuern die Job-Klasse also entsprechend ab, indem wir die dispatch() -Methode auf der Instanz der SendMailJob -Klasse aufrufen.

SendMailJob::dispatch($recipient, $subject);

Dadurch wird die Job-Klasse zur Warteschlange hinzugefügt und die E-Mail wird später im Hintergrund gesendet.

Starten Sie den Queue-Worker, indem Sie das php artisan queue:work -Kommando in der Konsole ausführen. Dadurch wird der Worker gestartet und wartet auf neue Jobs, die der Warteschlange hinzugefügt wurden.

Sobald der Queue-Worker gestartet ist, wird die SendMailJob -Klasse von der Warteschlange abgerufen und die E-Mail wird im Hintergrund gesendet.

Andreas Pabst hat 4,90 von 5 Sternen 106 Bewertungen auf ProvenExpert.com