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





Hinterlasse einen Kommentar

Kontakt
E-Mail: office@neoshops.de
Tel.: +49 [0]151 7000 7107
Carmen Bremen
Magento Certified Developer
Magento Certified Solution Specialist
Magento Certified Frontend Developer
Magento Freelancer


Magento Certified Developer Magento Certified Solution Specialist Magento Certified Frontend Developer



Magento Stammtisch Köln
Magento Stammtisch KölnDer nächste Kölner Magento Stammtisch findet statt am 31. Januar 2018. (Xing Event) Wer Interesse hat, kann sich in die Stammtisch-Gruppe auf Xing eintragen, ich sende eine Rund-E-Mail mit Details kurz vor dem Event!

Kontakt

Carmen Bremen.

In: Xing
In: Skype
In: Twitter
In: Google+
Per: Formular
Innermail: Office (t) neoshops.de
In Köln: In der Lößbörde 1, 50859 Köln
Per Handy: +49 [0]151- 7000 7107

Letzte Beiträge