Shopware 6 Cronjob einrichten: Eine Schritt für Schritt Anleitung

Du möchtest gerne wiederkehrende Aufgaben in Shopware 6 ausführen? Dann erklären wir dir in diesem Beitrag alles was du hierzu wissen musst.

Shopware 6 Cronjob einrichten: Eine Schritt für Schritt Anleitung

Grundsätzlich solltest du dir erstmal die Frage stellen, ob die auszuführende Aufgabe immer zu einem exakten Zeitpunkt, bspw. täglich um 03:00 Uhr oder in einem ungefähren Zeitintervall stattfinden soll.

Dies ist nämlich entscheidend, ob du die Aufgabe mittels Symfony Command oder Scheduled Task ausführen solltest. Falls dir die beiden Begriffe noch nichts sagen sollten – keine Sorge! Wir erklären dir den genauen Unterschied beider Methoden.

Symfony Command

Das Konzept der Symfony Commands wurde nicht von Shopware selbst, sondern durch das Symfony Framework, auf welchem Shopware basiert, entwickelt. Shopware baut lediglich auf diesen Commands auf und fügt eigene hinzu.

So kannst auch du eigene Commands hinzufügen. Wie das funktioniert, erfährst du sowohl in der offiziellen Shopware als auch in der Symfony Dokumentation.

Symfony Commands sind ideal, um wiederkehrende Aufgaben mittels Cronjob zu einem exakten Zeitpunkt auszuführen. Sofern dein Hoster dies unterstützt, kannst du die Commands direkt im Admin Panel deines Hosters ausführen lassen. Sollte dies bei dir nicht möglich sein ist es notwendig ein Shellskript zu definieren, auf dem Server abzulegen und vom Cronjob ausführen zu lassen.

Solltest du Probleme an dieser Stelle haben, helfen die meisten Hoster erfahrungsgemäß gerne weiter.

Ein solches Skript kann hierbei bspw. wie folgt aussehen, um den cache:clear Command auszuführen:

#!/bin/bash
env -i /usr/bin/php83 -f /pfad/zur/shopware-installation/bin/console cache:clear
Hinweis

Wir persönlich verwenden in den meisten Fällen lieber Symfony Commands für wiederkehrende Aufgaben. Sie sind zeitgenau konfigurierbar und einfach zu erstellen.

Der Vollständigkeit halber gehen wir jedoch im Folgenden auch noch auf die Scheduled Tasks ein.

Scheduled Tasks

Scheduled Tasks – auch geplante Aufgaben – sind wie der Name schon verrät, regelmäßige Arbeiten, die in Shopware 6 durchgeführt werden. Hierzu zählt bspw. die Generierung der Sitemap oder das Prüfen nach App Updates.

Damit diese Aufgaben regelmäßig abgearbeitet werden können werden sie in die sogenannte Message Queue geworfen. Dies ist nichts anderes als eine Warteschlange, in der jeder Scheduled Task nach und nach bearbeitet wird.

Angenommen es befinden sich drei Scheduled Tasks – A, B und C in der Message Queue, dann werden diese nacheinander abgearbeitet. Kommt ein neuer Task, bspw. Task D hinzu wird dieser entsprechend nach C abgearbeitet.

Wer zuerst kommt mahlt zuerst.

Morpheus - First come first serve meme

Quelle: https://knowyourmeme.com/

Probleme bei Scheduled Tasks

Wie man hier unschwer erkennen kann, findet in der Message Queue immer eine zeitliche Verschiebung einzelner Tasks statt. Solltest du einen neuen Task hinzufügen wollen, ist es gut möglich, dass andere Tasks vorher an der Reihe sind und eine Ausführung zu einem exakten Zeitpunkt nicht gewährleistet werden kann. Daher die eingängliche Frage, ob ein exakter Zeitpunkt für die Ausführung deiner Aufgabe notwendig ist.

Ein weiteres Problem von Scheduled Tasks ist, dass sie vom sogenannten Admin Worker bearbeitet werden. Der Admin Worker arbeitet in Shopware 6 jedoch nur, wenn du dich in der Administration deines Shopware Shops anmeldest. Solange sich niemand anmeldet, arbeitet der Admin Worker auch nicht. Dies wird dann zum Problem, wenn sich über einen längeren Zeitraum niemand in der Shopware Administration anmeldet oder man sie gar nicht benötigt, da man bspw. komplett aus einer Warenwirtschaft mittels Schnittstelle arbeitet.

Du siehst Scheduled Tasks sind bei exakten Zeitpunkten mit Admin Worker gänzlich ungeeignet.

Shopware 6 Admin Worker deaktivieren und CLI Worker starten

Das größte Problem was wir nun haben ist, dass der Admin Worker die Scheduled Tasks nur abarbeitet, sofern sich jemand in der Administration befindet. Dieses Verhalten lässt sich jedoch anpassen.

Hierzu müssen wir den Admin Worker deaktivieren und den CLI Worker aktivieren. Dies bedeutet nichts anderes als die Arbeiten des Admin Workers durch einen Cronjob bei deinem Hoster zu ersetzen.

Admin Worker deaktivieren

Den Admin Worker zu deaktiveren ist schnell getan. Navigiere hierzu in deiner Shopware Installation zu:

config/packages/z-shopware.yaml

Falls diese Datei bei dir nicht existieren sollte, kannst du sie einfach mit folgendem Inhalt anlegen:

shopware: 
    admin_worker: 
        enable_admin_worker: false

Die Einrückungen sind bei einer .yaml Datei übrigens entscheidend. Achte also darauf sie korrekt zu übernehmen, damit der Inhalt richtig eingelesen werden kann.

So schnell geht es auch schon. Der Admin Worker ist deaktiviert. Möchtest du ihn wieder aktivieren, setzt du enable_admin_worker einfach wieder auf true:

shopware: 
    admin_worker: 
        enable_admin_worker: true

Nun ist es wichtig einmal den Cache zu leeren. Wie du den Shopware 6 Cache leerst erfährst du in diesem Beitrag.

Cronjobs für CLI Worker einrichten

Zugegeben ist das Einrichten eines Cronjobs bei jedem Hoster unterschiedlich. Daher können wir dir hierzu keine Schritt für Schritt Anleitung mit an die Hand geben. Wenn du nun nicht mehr weiterkommen solltest, kannst du dich auch hier beim Support deines Hosters melden.

Wichtig ist nun zwei Cronjobs anzulegen, welche mit folgenden Commands die Arbeiten des Admin Workers korrekt ersetzen:

Hinweis

Ab Shopware v6.5 muss beim "messenger:consume" Befehl der sog. "Receiver" mit angegeben werden. Auch mit der Shopware v6.6 gab es hierbei wieder eine kleine Änderung. Nutze daher den Command entsprechend deiner Shopware Version.

# Ab Shopware 6.4 #
php bin/console messenger:consume --time-limit=300 --memory-limit=512M
# Ab Shopware 6.5 #
php bin/console messenger:consume failed async --time-limit=300 --memory-limit=512M
# Ab Shopware 6.6 #
php bin/console messenger:consume failed async low_priority --time-limit=300 --memory-limit=512M
php bin/console scheduled-task:run --time-limit=300 --memory-limit=512M

Du kannst die Befehle ebenfalls entweder über ein Shellskript oder im Idealfall direkt im Admin Panel deines Hosters angeben und ausführen lassen.

Die Shellskripte können hierbei wie folgt aussehen:

#!/bin/bash
env -i /usr/bin/php83 -f /pfad/zur/shopware-installation/bin/console messenger:consume failed async low_priority --time-limit=300 --memory-limit=512M
#!/bin/bash
env -i /usr/bin/php83 -f /pfad/zur/shopware-installation/bin/console scheduled-task:run --time-limit=300 --memory-limit=512M

Beide Befehle sind dabei sogenannte Watcher. Wer in Shopware 6 schon ein bisschen entwickelt hat, wird mit Sicherheit schon den Storefront und Admin Watchern begegnet sein. Wichtig ist hierbei zu verstehen das Watcher kontinuierlich weiterlaufen, sofern sie nicht abgebrochen werden. Die beiden oberen Watcher sollten erfahrungsgemäß jedoch im Produktivbetrieb nie länger als 5 Minuten am Stück laufen, um Performanceeinbußen deines Shops zu vermeiden:

Hinweis

--time-limit=300:
Beschreibt das Zeitintervall in Sekunden, nachdem der Befehl abgebrochen werden soll. 300 Sekunden = 5 Minuten

--memory-limit=512M:
Beschreibt das Memory Limit, welches auf 512MB gesetzt werden sollte.

Da nun die Commands definiert sind muss nun noch das Zeitintervall der Cronjobs angegeben werden. Wir empfehlen sie auf 6 Minuten zu setzen.

So werden die Commands gestartet, brechen nach exakt 5 Minuten ab und werden durch den Cronjob eine Minute später direkt wieder gestartet. Dieser Ablauf kann nun bedenkenlos in einer Endlosschleife durchgeführt werden.

Hinweis

Die Minute Zeitdifferenz ist hierbei bewusst gewählt, um zu vermeiden, dass mehrere Watcher gleichzeitig gestartet werden, was nicht zielführend wäre.

Dir ist das alles zu kompliziert?

Solltest du Probleme beim Einrichten deines Cronjobs haben, stehen wir dir gerne zur Verfügung. Wir freuen uns auf dich!

Scheduled Task hinzufügen

Nun weißt du was Scheduled Tasks, die Message Queue, Admin und CLI Worker sind. Damit du nun auch deine eigenen Aufgaben regelmäßig ausführen kannst, solltest du einen eigenen Scheduled Task hinzufügen. Wie genau das funktioniert, lernst du am besten direkt in der Shopware eigenen Dokumentation zum Thema Scheduled Task hinzufügen.

Interstellar Cooper - There is more meme

Quelle: https://tenor.com/