Ein Cronjob in Symfony
In Symfony einen Cronjob zu betreiben lässt sich ganz einfach mit einem eigenen Command plus Crontab (Linux) realisieren. Hier ein kurzer Guide für einen Cronjob in Symfony.
Command?
Was ist denn eigentlich ein Command? Zum Beispiel ein php bin/console cache:clear
!
Zu einem simplen Command gehört nicht viel: Ein „extend“ von Command
, einen Namen vergeben (z.B. „cronjob:execute“) und das, was das Teil eigentlich tun soll, in der dazu passenden Funktion definieren. Braucht man Container Komponenten wird stattdessen das ContainerAwareCommand
extended. Damit dürfen auch Doctrine und Co. genutzt werden.
Nach Update auf Version 3.3: Werden weitere Komponenten für den Cronjob benötigt, können diese per Dependency Injection eingefügt werden. Das Kommando ist nämlich auch nur ein Service. Das ContainerAwareCommand
ist deprecated und sollte hingegen nicht mehr genutzt werden!
Den Cronjob erstellen
Für einen ordentlichen Cronjob fehlt also nur noch ein Dienst, der zu einer bestimmten Zeit den Befehl php bin/console cronjob:execute
aufruft.
Am besten eignet sich dazu der Crontab, der auf Linux für jeden Nutzer im System eingerichtet werden kann. So wird auch sichergestellt, dass die Ausführung des Command mit dem Nutzer „www-data“ (Apache2 oder NGINX) ausgeführt werden kann.
Tipp: Auf https://crontab.guru/ kann man die Ausführungszeit des Crontab testen und validieren. Es macht einen Unterschied, welche Version des Programms auf dem System installiert ist, um gewissen Schreibweisen nutzen zu können.
Auf Windows kann die Aufgabenplanung zum Ausführen des Cronjobs verwendet werden. Es lohnt sich in diesem Fall, ein Bash-Skript mit dem PHP Befehl (und ggf. einem chdir
in den Projektordner) zu definieren, das dann von Planer aufgerufen werden kann.