FAQ - Häufig gestellte Fragen - Shopware 4

Shopware Cronjobs [quote=„Wikipedia“]Der Cron-Daemon dient der zeitbasierten Ausführung von Prozessen in Unix und unixartigen Betriebssystemen wie Linux, BSD oder Mac OS X, um wiederkehrende Aufgaben – sogenannte Cronjobs – zu automatisieren. Häufig führt der Cron-Daemon wichtige Programme für die Instandhaltung des Systems aus, wie zum Beispiel Dienste für das regelmäßige Archivieren und Löschen von Logdateien.[/quote] Die Shopware Cronjobs sind Mechanismen, die während des normalen Shopbetriebs im Hintergrund wiederkehrende Aufgaben erledigen - darunter zb das Generieren neuer SEO URLs, das Aktualisieren von Topsellern oder das Versenden von Bewertungs-Emails. Dabei stellt Shopware jedoch lediglich die Cronjobs (und die Intervalle) bereit - ihr müsst dafür sorgen, dass diese regelmäßig ausgeführt werden. Das geschieht durch manuellen Aufruf über den Browser, über den eigenen Server oder über externe Dienstleister. Im Klartext: es reicht nicht aus, wenn ihr die Shopware Cronjobs aktiviert - aber diese nicht durch externe Anwendungen gestartet / ausgeführt werden. Aber Schritt für Schritt… Cron Plugin installieren Die Installation des mitgelieferten „Cron“ Plugin ist Grundvoraussetzung. Zusätzlich bringt Shopware von Haus aus noch weitere nützliche Cronjobs mit, die installiert werden können.

Cron-Sicherheit prüfen Ab Shopware 4.3.0 ist es möglich den Aufruf der Shopware Cronjobs sicherer zu gestalten, so dass diese bspw. nur mit einem gültigen Schlüssel aufgerufen werden können. Solltet ihr also euren Schlüssel nicht kennen oder die Cronjobs über eine falsche IP aufrufen, dann werde diese selbstverständlich nicht ausgeführt: Shopware Cronjobs prüfen Auszuführende Cronjobs müssen in den Grundeinstellungen aktiviert sein. Zu Testzwecken könnt ihr das Datum der „nächsten Ausführung“ auf ein beliebiges Datum in der Vergangenheit setzen, um die Ausführung zu erzwingen. Sollte ein Cronjob einmal fehlerhaft ausgeführt werden, dann wird dieser automatisch deaktiviert. Die Fehlermeldung findet ihr dann im Feld „Ergebnisdaten“. Cronjobs aufrufen Um den Cronjob zu testen gebt einfach im Browser folgende URL ein: http://www.meinshop.de/backend/cron Die Ausführung erfolgt dann direkt und das Ergebnis ist im Browser als Text zu lesen. Bitte beachtet, dass manche Cronjobs sehr aufwändig sind und evtl. über die erlaubte Verbindungszeit oder die erlaubte Script-Laufzeit hinauslaufen. Cronjobs wiederholt / in Intervallen ausführen Nun zum wichtigsten Schritt - der gleichzeitig für die meiste Verwirrung und Ratlosigkeit sorgt: das Ausführen der Cronjobs passiert -nicht- automatisch oder durch Shopware selber. Ihr müsst dafür sorgen, dass die oben angegebene URL in festen Intervallen abgerufen wird. Solltet ihr root Zugriff auf euren Server haben, dann könnt ihr entsprechende crontabs einrichten. Die Grundlagen zu crontabs würden den Umfang dieser FAQ sprengen - wendet euch dazu an euren Provider / euren Server Administrator oder lest euch via google in das Thema ein. Solltet ihr dagegen keinen Zugriff auf den Server haben - und zb Shared Webspace nutzen - dann müsst ihr die URL entweder selber aufrufen oder ihr wendet euch an externe Dienstleister, die die URL regelmäßig abfragen. Um Werbung zu vermeiden: diese Dienstleister findet ihr ebenfalls über google. Weiterführende Infos aus dem Shopware wiki Cronjobs: http://wiki.shopware.com/Cronjobs_detail_1102_792.html Cron-Sicherheit: http://wiki.shopware.com/_detail_1751.html Cronjobs erweitern Nun ist die Ausgabe der Cronjobs doch recht „unübersichtlich“. Hinzu kommt, dass lediglich eine leere, weiße Seite angezeigt wird, wenn kein Cronjob abgearbeitet werden muss und man sich nicht sicher ist, ob evtl. ein Fehler aufgetreten ist. Möchte man nun auch noch die einzelnen Ausführungszeiten der Cronjobs wissen und loggt man die Ergebnisse für spätere Auswertungen dann steht man vor einer großen Aufgabe. Um die Ausgabe der Cronjobs ein wenig lesbarer und informativer zu gestalten, könnt ihr euch ein kleines Plugin basteln. So sieht die Ausgabe vorher aus: So könnte eine optimierte Ausgabe aussehen: Ausschnitt eines Plugins [code] // timers private $microtime_start = null; private $microtime_last = null; // new line - viewable with either a browser or a texteditor private $new_line = "\n
"; /** * Get a timing string with last checkpoint and global time. * * @return string **/ protected function getTime() { // create global time $time_start = explode(’ ‚, $this->microtime_start); $time_end = explode(‘ ‚, microtime()); $parse_time = number_format(($time_end[1] + $time_end[0] - ($time_start[1] + $time_start[0])), 3, „,“, „.“); // create checkpoint time $time_start = explode(‘ ‚, $this->microtime_last); $time_end = explode(‘ ', microtime()); $last_time = number_format(($time_end[1] + $time_end[0] - ($time_start[1] + $time_start[0])), 3, „,“, „.“); // reset last time $this->microtime_last = microtime(); // write string $str = „Time - checkpoint: " . $last_time . " Sek - gesamt: " . $parse_time . " Sek“; // return it return $str; } /** * Registers all necessary events and hooks. * * @return void */ private function installSubscribeEvents() { // register our replace hook $this->subscribeEvent( ‚Shopware_Controllers_Backend_Cron::indexAction::replace‘, ‚replaceCronIndexActionHook‘ ); // and done return; } /** * Replace the cronjob output. * * @param Enlight_Hook_HookArgs $arguments * * @return void **/ public function replaceCronIndexActionHook( Enlight_Hook_HookArgs $arguments ) { // set times $this->microtime_start = microtime(); $this->microtime_last = microtime(); // get new line char $nl = $this->new_line; // start output echo "


Starte Cronjobs" . $nl . "Datum: " . date( „Y-m-d H:i:s“ ) . $nl . "


" . $nl . $nl; // loop every cronjob while ( ( $job = Shopware()->Cron()->getNextJob() ) !== null ) { // get cron action name $action = $job->getAction(); // start the cronjob echo "


Starte Cronjob - " . $job->getName() . $nl . "


"; Shopware()->Cron()->runJob( $job ) . $nl; echo "


Beende Cronjob" . $nl . $this->getTime() . $nl . "


" . $nl . $nl; } // cronjob finished echo "


Beende Cronjobs" . $nl . $this->getTime() . $nl . "Datum: " . date( „Y-m-d H:i:s“ ) . $nl . "


" . $nl . $nl; // and done return; } [/code]