Bei einem Großteil der Magento-Installationen sind die Cronjobs nicht richtig eingerichtet, wie auch beim Magento Developers Paradise 2012 beklagt wurde. Grund genug für mich, im heurigen Türchen eine Einführung zu geben und so dem einen oder anderen Cronjob zur Geburt zu verhelfen.
Cronjobs in Magento
Magento bringt bereits eine Reihe fertiger Jobs mit. Man muss sie nur noch einrichten, damit sie auch ausgeführt werden.
Für diesen Zweck findet man im Root-Verzeichnis der Magento-Installation das Skript cron.sh. Es ruft cron.php auf, das eine Rumpf-Version der Magento-Applikation startet und die dort definierten Cronjobs ausführt.
Magento verfügt nämlich über eine eigene Cronjob-Verwaltung. Dadurch ist es möglich, die Jobs in PHP zu programmieren und ihren Ablaufplan über die Konfiguration zu steuern.
Ein Hinweis vorab: dieses Türchen bezieht sich auf Linux-Systeme, da die allermeisten Shop-Installationen darauf laufen.
Einrichtung von cron.sh
Im ersten Schritt wird cron.sh für jenen Linux-User ausführbar gemacht, der die Cronjobs aufruft. Je nach Server-Setup müssen die Rechte für den Besitzer, die Gruppe oder für alle freigegeben werden. Generell gilt: je restriktiver die Rechte gesetzt werden können, desto besser.
Im zweiten Schritt trägt man den Job in crontab ein, also die Datei, welche die Aufgaben für cron auflistet. Das geht üblicherweise so:
crontab -e
Mit dem Befehl wird crontab geöffnet. Nun kann man den neuen Job eintragen:
/5 * /var/www/pfad/zu/magento/cron.sh
Diese Zeile bewirkt, dass Magentos Cron-Script alle 5 Minuten aufgerufen wird. Die genaue Syntax könnt ihr dem obigen Wikipedia-Link entnehmen. Achtet darauf, dass ihr crontab mit einer leeren Zeile abschließt, sonst wird der letzte Job in der Regel nicht ausgeführt.
Zudem ist wichtig, dass der User, der die Cronjobs ausführt, die benötigten Rechte hat!
Die Cronjobs sollten jetzt fertig eingerichtet sein. Habt ihr etwas falsch gemacht, dann erhält euer Linux-User Meldungen per Mail und ihr könnt euch auf die Fehlersuche machen.
Überprüfung und Konfiguration
Was tut Magento im Hintergrund? Es erstellt in regelmäßigen Abständen Jobs, die beim Aufruf durch cron ausgeführt werden. Die Konfiguration ist im Magento-Backend unter "System > Configuration > Advanced > System > Cron (Scheduled Tasks) - all the times are in minutes" zu finden:
Diese Einstellungen möchte man wahrscheinlich anpassen. Es ist ärgerlich, wenn fehlgeschlagene Cronjobs nur 10 Stunden archiviert werden und man Montag Morgen im Büro nicht feststellen kann, was denn am Wochenende genau schief gelaufen ist. (Sofern ihr kein automatisiertes Monitoring für Cronjobs verwendet.)
Um zu überprüfen, wie es den Cronjobs ergangen ist, kann man einen Blick in die Datenbank-Tabelle cron_schedule werfen:
Hier werden alle generierten Jobs und ihr Status aufgelistet. Diese Ansicht ist leider nicht komfortabel. Die Cronjobs gehen in Magento dadurch unter.
Cronjob-Verwaltung 2.0
Wenn ich einen neuen Shop aufsetze, ist einer meiner ersten Schritte daher die Installation der Extension Aoe_Scheduler von Fabrizio Branca. Sie kann über modman, Composer oder Magento Connect eingerichtet werden. Ich empfehle modman oder Composer, da auf Magento Connect nicht die aktuelle Version zu finden ist.
Aoe_Scheduler fügt im Backend-Menüpunkt "System > Scheduler" drei neue praktische Ansichten hinzu:
- Überblick über die Cronjobs und ihre Konfiguration
- Die Liste der nächsten Jobs als Tabelle
- Eine graphische Darstellung der gelaufenen und geplanten Jobs
Anbei ein paar Screenshots, mit denen man einen guten Eindruck gewinnt.
Die Extension birgt folgende Vorteile:
- Aktivieren/Deaktivieren der Cronjobs ohne Eingriffe in Config-XML-Dateien
- Übersicht über die Konfiguration und den Status der diversen Jobs
- Kommandozeilen-Script und Web-Service-API-Befehle zum Erzeugen und Ausführen von Jobs
- Ein "heartbeat"-Cronjob, der für die Überwachung der Cronjob-Funktionalität in Monitoring-Systemen verwendet werden kann
Besonders die Timeline-View erweist sich als hilfreich, da fehlgeschlagene Cronjobs farblich hervorgehoben werden und die Laufzeit der Jobs auf einen Blick ersichtlich ist. Beim Hovern über die Jobs erhält man weitere Details.
Magento-Standard-Cronjobs
Nun ist es an der Zeit, die von Magento mitgelieferten Jobs durchzugehen, nicht benötigte zu deaktivieren und die Ablaufpläne (falls nötig) anzupassen. Sehen wir uns an, welche Jobs die Magento Community Edition 1.7 bietet.
Backup
Code | Cron Expression | Model |
---|---|---|
system_backup | backup/observer::scheduledBackup |
Auf Wunsch führt Magento mit dem Job "system_backup" Sicherungen der Datenbank, Media- und/oder Code-Dateien durch. Damit das Backup erstellt wird, muss es über den Menüpunkt "System > Configuration > Advanced > System > Scheduled Backup Settings" konfiguriert werden.
Wer sich über das seit 1.7 erhältliche Backup-/Rollback-Feature informieren möchte, findet dazu einen Beitrag in meinem Blog. Falls ihr die Daten auf anderen Wegen sichert, könnt ihr den Job ruhig über Fabrizios Extension deaktivieren. Auf irgendeine Weise muss aber gesichert werden.
Cache
Code | Cron Expression | Model |
---|---|---|
core_clean_cache | 30 2 * * * | core/observer::cleanCache |
Der Job "core_clean_cache" leert veraltete Cache-Einträge. Es wird also nicht alles gelöscht. Und kaum, dass ich das geschrieben habe, muss ich es relativieren. Welche Einträge betroffen sind, hängt nämlich von den eingesetzten Cache-Backends und einigen Settings ab. Gute Informationen zur Cache-Problematik liefert Fabrizio.
CAPTCHAs
Code | Cron Expression | Model |
---|---|---|
captcha_delete_expired_images | */10 * * * * | captcha/observer::deleteExpiredImages |
captcha_delete_old_attempts | */30 * * * * | captcha/observer::deleteOldAttempts |
Google Sitemap
Code | Cron Expression | Model |
---|---|---|
sitemap_generate | sitemap/observer::scheduledGenerateSitemaps |
- Die Sitemaps müssen im Hauptmenüpunkt "Catalog > Google Sitemap" angelegt werden.
- Der Cronjob muss in "System > Configuration > Catalog > Google Sitemap" aktiviert und konfiguriert werden.
Katalog
Code | Cron Expression | Model |
---|---|---|
catalog_product_index_price_reindex_all | 0 2 * * * | catalog/observer::reindexProductPrices |
catalogrule_apply_all | 0 1 * * * | catalogrule/observer::dailyCatalogUpdate |
catalog_product_alert | productalert/observer::process |
Logs
Code | Cron Expression | Model |
---|---|---|
log_clean | log/cron::logClean |
Magento Mobile
Code | Cron Expression | Model |
---|---|---|
xmlconnect_notification_send_all | */5 * * * * | xmlconnect/observer::scheduledSend |
Newsletter
Code | Cron Expression | Model |
---|---|---|
newsletter_send_all | */5 * * * * | newsletter/observer::scheduledSend |
PayPal
Code | Cron Expression | Model |
---|---|---|
paypal_fetch_settlement_reports | paypal/observer::fetchReports |
Quotes & Warenkorb
Code | Cron Expression | Model |
---|---|---|
persistent_clear_expired | 0 0 * * * | persistent/observer::clearExpiredCronJob |
sales_clean_quotes | 0 0 * * * | sales/observer::cleanExpiredQuotes |
Verkäufe und Reporting
Code | Cron Expression | Model |
---|---|---|
aggregate_sales_report_bestsellers_data | 0 0 * * * | sales/observer::aggregateSalesReportBestsellersData |
aggregate_sales_report_invoiced_data | 0 0 * * * | sales/observer::aggregateSalesReportInvoicedData |
aggregate_sales_report_order_data | 0 0 * * * | sales/observer::aggregateSalesReportOrderData |
aggregate_sales_report_refunded_data | 0 0 * * * | sales/observer::aggregateSalesReportRefundedData |
aggregate_sales_report_shipment_data | 0 0 * * * | sales/observer::aggregateSalesReportShipmentData |
aggregate_sales_report_coupons_data | 0 0 * * * | salesrule/observer::aggregateSalesReportCouponsData |
aggregate_sales_report_tax_data | 0 0 * * * | tax/observer::aggregateSalesReportTaxData |
Währungen
Code | Cron Expression | Model |
---|---|---|
currency_rates_update | 0 0 * * * | directory/observer::scheduledUpdateCurrencyRates |
Ablaufpläne der Standard-Jobs verändern
Nachdem wir nun feststellen können, welche Cronjobs für uns relevant sind, geht es an die Ablaufplanung (wer es lieber englisch hat: "scheduling"). Einige Jobs bieten die Möglichkeit, die Ablaufpläne über Einträge in "System > Configuration" zu verändern. Wer Tasks umplanen möchte, welche diese Option nicht bieten oder wer Änderungen direkt über Files warten will, kann das in der Datei config.xml seiner Extension tun:<?xml version="1.0" encoding="UTF-8"?>
<config>
<!-- Restliche Konfiguration -->
<crontab>
<jobs>
<catalog_product_index_price_reindex_all>
<schedule>
<cron_expr>30 1 * * *</cron_expr>
</schedule>
<catalog_product_index_price_reindex_all>
</jobs>
</crontab>
</config>
Einfach den Code des Cronjobs verwenden und eine Schedule festlegen, schon ist die Sache erledigt. Außerdem muss man dafür sorgen, dass die eigene Extension nach dem entsprechenden Magento-Modul geladen wird.
Eigene Cronjobs hinzufügen
Eigene Cronjobs lassen sich denkbar einfach festlegen. Nötig sind nur:- der Name ("code") für den Cronjob
- eine Schedule (in Form einer Cron-Expression oder eines Hinweises, in welchem "System > Config"-Eintrag man die Cron-Expression findet)
- das Model und die Methode, die aufgerufen werden sollen.
<?xml version="1.0" encoding="UTF-8"?>
<config>
<!-- Restliche Konfiguration -->
<crontab>
<jobs>
<webguys_cronjob_one>
<schedule>
<cron_expr>0 */2 * * *</cron_expr>
</schedule>
<run>
<model>webguys_example/observer::cronjobOne</model>
</run>
</webguys_cronjob_one>
<webguys_cronjob_two>
<schedule>
<config_path>webguys/example/cronjob_two</config_path>
</schedule>
<run>
<model>webguys_example/observer::cronjobTwo</model>
</run>
</webguys_cronjob_two>
</jobs>
</crontab>
</config>
Nützliche Extensions
Zum Abschluss Hinweise auf einige Extensions, die ich regelmäßig bei Magento-Shops für die Datenwartung nutze und bei denen Cronjobs eine wichtige Rolle spielen:- Aoe_AsyncCache: schreibt Lösch-Befehle für den Cache in eine Queue, anstatt sofort zu löschen (asynchrones Cache-Löschen). Dadurch wird der Cache seltener gelöscht und bestimmte Operationen wie der Backend-Login beschleunigt. Der Cronjob für die tatsächliche Löschung der Cache-Einträge wird standardmäßig alle 15 Minuten ausgeführt.
- Aoe_CacheCleaner: leert verschiedene Teile des Caches (den gesamten Cache, den Magento-Cache, JS/CSS, Katalogbilder). Die Schedule ist für jeden Teil getrennt konfigurierbar.
- Aoe_QuoteCleaner: löscht alte Warenkörbe / Quotes unabhängig davon, ob sie in eine Bestellung überführt wurden. Wie oben erwähnt ist das sinnvoll, um die Datenmenge nicht zu stark ansteigen zu lassen. Wie lange man hofft verwaiste Warenkörbe noch reaktivieren zu können, ist mitunter eine Marketing-Frage. Wenn der Warenkorb trotz aller Bemühungen z.B. sechs Monate unberührt geblieben ist, kann man die Quote aber wohl ohne Bedenken löschen.