Blog
Magento doithisself: Cronjobs einrichten und laufen lassen
Also ich stelle mir den Cronjob als Buddeljob vor, der nach seinen Geräuschen benannt worden ist, die das Grabmännlein von sich gibt. „cron, cron, cron“. Aber heute werde ich ganz seriös ein Tutorial schreiben und dabei sehr sehr sachlich bleiben.
Was braucht ein Cronjob?
1. Den Eintrag in der Crontab des Servers
2. Die Konfiguration in Magento
3. Die Konfiguration im Modul
4. Die visuelle Überwachung
Was ist ein Cronjob?
Ein Cron-Daemon ist ein Dienst, der serverseiting läuft und Scripte und Programme (die Cronjobs) zu definierten Zeiten starten kann. Einige Server haben in ihren Serververwaltungsweboberflächen einen Menüpunkt der da „Cronjob Manager“ heißt, in welchem man einen Cronjob anlegen kann. Bei anderen Servern startet man diesen via Shell, bzw. SSH. Das Ergebnis ist bei beiden Methoden dasselbe.
Die Organisation der Jobs findet in einer „Stundenplan“-Tabelle auf dem Server statt und folgt einem bestimmten Schema. Der Befehl dazu lautet „crontab“ und darüber will ich auch gar nicht viel erzählen, da ich eigentlich über Magento reden will. Nur so viel: man muss auf die Minute genau sagen, welcher Prozess gestartet werden soll. Ein Cronjob besteht im Normalfall aus sechs mit Leerzeichen getrennten Angaben: 5 Zeit-Argumente und dann der auszuführende Befehl. Je nachdem auch der Pfad zu PHP. Hier ist es ganz hübsch aufgelistet:
http://stetix.de/cronjob-linux-tutorial-und-crontab-syntax.html
http://www.thesitewizard.com/general/set-cron-job.shtml
Welche Cronjobs nutzt Magento?
Z.B. die Newsletterversenderei wird über Cronjobs angestoßen, das Generieren der Google-Sitemaps, die Katalogpreisregeln, die Log-Bereinigung, Kundenbenachrichtigungen, Währungskurse…
Welcher Job wird gestartet?
Für die Magento Cronjobs soll der Cron-Manager des Servers die cron.php im Root-Verzeichnis des Shops ausführen. Es wird der /absoluter/pfad/zur/cron.php angegeben. So ein Vorbeigucken beschäftigt den Server immer – also sollte man sich überlegen, ob man ihn wirklich alle 5 Minuten beschäftigen will, oder ob alle 2 Stunden auch reicht.
Wo und wie werden in Magento die Cronjobs verwaltet?
In Magento selbst gibt es eine Datenbanktabelle, in der die einzelnen Jobs gespeichert werden. Wenn also ein Modul also gerne alle zwei Stunden Methode x ausgeführt haben möchte, dann wird diese Info in diese Datenbanktabelle geschrieben: cron_schedule.
Dort wird neben dem Jobnamen auch der aktuelle Status, und das Datum und die Uhrzeit zu den Zeitpunkten: angelegt am/um, geplant für, ausgeführt am/um, fertiggestellt am/um. Außerdem – wenn das Modul uns was zu sagen hat, auch eine „Message“.
Aber zunächst ins Backend. Und dort unter System->Konfiguration->Erweitert->System den Tab „Cron“ aufrufen. In diesem wird nun quasi Magento mitgeteilt, dass, wenn ein Servercron vorbei kommt und die Cron.php aufruft, die Module, die sich für Cronjobs angemeldet haben, nach einem bestimmten Zeitplan in der Tabelle cron_schedule gepflegt werden.
Die Angaben werden in Minuten gemacht. Und wenn ich im Netz so rumsurfe, habe ich immer den Eindruck, dass eigentlich niemand so richtig weiß, was denn da genau konfiguriert wird. Daher liste ich mal auf, was ich verstanden zu haben glaube:
Generate schedules every: hier wird die Zeitspanne angegeben, in der der Cronjob (im Folgenden „Jobber“ genannt) so vorbei kommt (im Folgenden „every“ genannt). Kommt er also einmal pro Stunde vorbei, dann „60“ eintragen, kommt er alle 15 Minuten, dann „15“.
Schedule ahead for: wie lange im voraus sollen die Jobs eingesammelt werden? Wenn der Jobber alle 60 Minuten vorbei kommt, also mindestens für die nächsten 60 Minuten. Denkt man sich. Interessanterweise sollte dieser Wert aber höher als der every-Wert liegen, da die System-Zeit und die PHP-Zeit durchaus eine Stunde auseinanderliegen können… Also im 60-Minutenfall 120 eintragen…
Missed if not run within: wenn der Jobber vorbei kommt und auf die vergangene Zeit zurück blickt und feststellt, dass ein Job nicht ausgeführt wurde – wann soll er ihn als gescheitert betrachten und aus der Todoliste streichen und nicht mehr starten? Hier kann man großzügig sein und das Doppelte oder mehr von der every-Zeit angeben.
History cleanup every: Magento behält die Jobs auch mit dem Status „success“ in seiner Datenbanktabelle, bis sie gelöscht werden. Wie oft geguckt werden soll, ob was gelöscht werden soll, wird hier angegeben. Sinn macht der every-Wert, also immer, wenn der Jobber vorbei kommt. Im 60 Minuten-Fall also auch hier 60 angeben.
Success history lifetime: Wie lange sollen die glücklichen, erfolgreichen Jobs in der Datenbank vorgehalten werden? Wer einen24-Stunden Puffer zum Nachsehen haben möchte, sollte hier 1440 Minuten angeben.
Failure history lifetime: Wie lange sollen die unglücklichen, gescheiterten Jobs in der Datenbank vorgehalten werden? Auch hier macht mind. 24 Stunden Sinn, also 1440 Minuten.
Für einen alle-15-Minuten-Jobber, sähen die Werte also beispielsweise so aus:
Generate Schedules Every 15 Schedule Ahead for 30 Missed if Not Run Within 45 History Cleanup Every 15 Success History Lifetime 1440 Failure History Lifetime 1440
Für einen alle-60-Minuten-Jobber, sähen die Werte also beispielsweise so aus:
Generate Schedules Every 60 Schedule Ahead for 90 Missed if Not Run Within 120 History Cleanup Every 60 Success History Lifetime 1440 Failure History Lifetime 1440
Welche Cronjobs sollte/könnte man konfigurieren?
An unterschiedlichen Orten.
Die Logbereinigung (die unbedingt aktiviert werden sollte, weil sich hier echt ganz schön was ansammelt) wird hier konfiguriert:
System->Konfiguration->Erweitert->System->Log Bereinigung
Dann gibt’s die Sitemap unter:
System->Konfiguration->Katalog->Google Sitemap->Einstellungen für die Erstellung
Die Artikelbenachrichtungen richten man ein unter:
System->Konfiguation->Katalog->Katalog->Ausführungseinstellungen für Artikelbenachrichtigungen
Währungs-Aktualisierungen unter:
System->Konfiguration->Allgemein->Einrichten der Währung->Einstellungen für den terminierten Import
Wie lege ich einen Cronjob in meinem Modul an?
Na, ganz in Magento-Logik ganz in XML…. Und dafür braucht man auch gar nicht viel Schnipsel. Ich nehme mal beispielhaft den Cronjob für die Währungs-Aktualisierung:
<crontab> <jobs> <aggregate_sales_report_tax_data> <schedule> <cron_expr>0 0 * * *</cron_expr> </schedule> <run> <model>tax/observer::aggregateSalesReportTaxData</model> </run> </aggregate_sales_report_tax_data> </jobs> </crontab>
Übersetzt: lieber Magento, wenn Du Deine Konfiguration zusammenbaust, berücksichtige doch bitte für die „crontab“-Tabelle folgenden „Job“: “ aggregate_sales_report_tax_data“. Plane (schedule) diesen bitte für die Ausführungszeit (cron_expr) Jeden Tag um 0 Uhr ein. Führe (run) dafür bitte folgendes aus (model): In der Klasse Mage_Tax_Model_Observer die Methode aggregateSalesReportTaxData().
Wenn man also sein eigenes Modul mit einem Cronjob versehen möchte, der alle 5 Minuten ausgeführt werden soll, könnte dies so aussehen:
<crontab> <jobs> <namespace_modulname> <schedule> <cron_expr>*/5 * * * *</cron_expr> </schedule> <run> <model>namespace_modulname/observer_oder_model::myFunction</model> </run> </namespace_modulname> </jobs> </crontab>
Was passiert im Hintergrund?
Nur kurz, weil das Wesentliche schon gesagt wurde: das Modul Mage_Cron verwaltet die Cronjobber. Und gestartet wird das ganze Jobben -tataaaa – in der cron.php – was ja auch Sinn macht….
try { Mage::getConfig()->init()->loadEventObservers('crontab'); Mage::app()->addEventArea('crontab'); Mage::dispatchEvent('default'); } catch (Exception $e) { Mage::printException($e); }
Dort wird ein eigener Event-Observer nur für die Crontab initialisiert, der Event-Bereich „crontab“ hinzugefügt und schließlich noch der Event „default“ benannt.
Das Pendant dazu, bzw. die Nutzung dessen, findet sich in der config.xml des Mage_Cron-Moduls.
<crontab> <events> <default> <observers> <cron_observer> <class>cron/observer</class> <method>dispatch</method> </cron_observer> </observers> </default> </events> </crontab>
Die dispatch()-Methode kümmert sich dann um das Einsammeln der crontab-jobs, um das Generieren der Jobs und um das Aufräumen der cron_scheduler-Tabelle.
Kann man das auch angucken?
Ja, dank der wunderhübschen Extension Aoe_Scheduler von Fabrizio Branca. Mit der kann man sehr übersichtlich anschauen, was so kommt an Jobs und was so gelaufen ist… Man muss also nicht immer in der Datenbank nachsehen, ob alles geklappt hat und die Jobs, von denen man erwartet hat, dass sie ausgeführt wurden, nun den Status „success“ haben. Mit dieser Erweiterung, kriegt man das sehr nett visualisiert. Und man kann auch die Jobs von dort direkt ausführen oder ausschalten. Lohnt sich!
http://www.fabrizio-branca.de/magento-cron-scheduler.html