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

Laravel Powerkurs
Lerne das weltweit beliebteste PHP-Framework, das bei der Entwicklung vieler Webanwendungen eingesetzt wird. Hier zeigen wir dir das Framework Schritt für Schritt mit praktischen Beispielen.

Laravel Multi Tenancy (Mehrmandanten Fähigkeit)
Mehrmandanten Anwendungen stellen für viele Nutzer jeweils eine eigene Umgebung bereit. Wichtig sind dabei Konzepte wie (Sub-)Domain Driven Tenants, etc. Hierfür bietet Laravel ein großartiges Package!

Laravel Testing Onlinekurs
Laravel ist ein beliebtes PHP-Framework, das bei der Entwicklung von Webanwendungen eingesetzt wird. Eine der wichtigsten Phasen in der Webentwicklung ist das Testen der Anwendung, um sicherzustellen, dass sie fehlerfrei und reibungslos funktioniert.
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.

Laravel Powerkurs
Lerne das weltweit beliebteste PHP-Framework, das bei der Entwicklung vieler Webanwendungen eingesetzt wird. Hier zeigen wir dir das Framework Schritt für Schritt mit praktischen Beispielen.

Laravel Multi Tenancy (Mehrmandanten Fähigkeit)
Mehrmandanten Anwendungen stellen für viele Nutzer jeweils eine eigene Umgebung bereit. Wichtig sind dabei Konzepte wie (Sub-)Domain Driven Tenants, etc. Hierfür bietet Laravel ein großartiges Package!

Laravel Testing Onlinekurs
Laravel ist ein beliebtes PHP-Framework, das bei der Entwicklung von Webanwendungen eingesetzt wird. Eine der wichtigsten Phasen in der Webentwicklung ist das Testen der Anwendung, um sicherzustellen, dass sie fehlerfrei und reibungslos funktioniert.