Hinweis: Dies ist mein privater Blog.
Für Software-Entwicklung und Refactoring siehe weigandtlabs.de.

WordPress auf echten Cronjob umstellen

WordPress hat ein kleines Cronjob-System integriert, mit dem bestimmte Aufgaben immer regelmäßig ausgeführt werden. So prüft WordPress zum Beispiel zwei Mal am Tag, ob es neue Updates für den WordPress-Core, die Plugins oder die Themes gibt.

Dieses Cronjob-System hat allerdings eine kleine Schwäche: Es ist genau genommen gar keins. WordPress kann nur dann regelmäßig Aufgaben ausführen, wenn die Seite besucht wird. Jedes Mal, wenn ein Besucher die Webseite aufruft, überprüft WordPress, ob irgendwelche Aufgaben erledigt werden müssen.

Wenn aber kein Besucher die Seite aufruft, werden auch keine Aufgaben erledigt. Das kann ärgerlich sein, wenn ein Plugin regelmäßige Daten lesen und abspeichern soll (zB. Twitter-Statistiken oder ähnliches) oder man die WordPress-Funktion „Via E-Mail schreiben“ verwendet.

Der beste Weg, dieses Problem zu beheben, ist, einen richtigen Cronjob einzurichten.

WordPress vorbereiten

Zuerst müssen einige Vorbereitungen für WordPress getroffen werden.

Wenn ein Besucher die Webseite besucht, überprüft WordPress, ob Aufgaben erledigt werden müssen. Ist das der Fall, wird eine neue http-Verbindung zum Server aufgebaut und die Datei wp-cron.php aufgerufen, die dann die Aufgaben erledigt. Dabei wartet WordPress aber nicht, bis dieser Prozess beendet ist, sondern fährt mit der Generierung der Webseite für den User fort. Der Besucher bekommt davon also gar nichts mit.

Konkret sollte man die Überprüfung nach neuen Aufgaben bei Seitenaufruf abstellen. Das ist zwar nicht unbedingt notwendig, spart aber etwas Zeit für den Seiteaufbau und unnötige Rechenleistung.

Um die Überprüfung abzuschalten, muss folgende Zeile in die wp-config.php geschrieben werden:

define('DISABLE_WP_CRON', true);

Update (30.10.2011): In der wp-config.php setzt man diese Zeile am besten direkt über die Zeile mit dem Kommentar „/* That’s all, stop editing! Happy blogging. */

Damit werden ab sofort nur noch Cronjobs überprüft, wenn explizit die wp-cron.php aufgerufen wird. Und diese Aufgabe kann jetzt von einem richtigen Cron erledigt werden.

“Echten“ Cronjob einrichten

Wenn der eigene Hoster Cronjobs anbietet, benutzt man diese am besten. Wenn nicht, kann man auch das kostenlose Angebot von cronjob.de nutzen, eine vorherige Registrierung vorausgesetzt.

Um einen neuen Cronjob anzulegen, sollte man bei jedem Anbieter ein solches Formular finden können. (Wenn auf dem Server Confixx eingerichtet ist, findest du die Cronjob-Verwaltung unter Einstellungen -> Crontab)

Hier müssen jetzt einige Angaben gemacht werden. Die linken 5 Felder bestimmen die Terminierung, in der ein Befehl (rechtes Feld) ausgeführt werden soll. Möchte man nun einstellen, dass die wp-cron.php von WordPress jede Stunde aufgerufen wird, dann füllt  man die Felder folgendermaßen aus:

Als Befehl habe ich diese Zeile eingetragen: (Die URL muss natürlich noch entsprechend angepasst werden)

curl -Iso /dev/null http://www.example.com/wp-cron.php
Anmerkung für FortgeschritteneIch weiß, dass es auch mit wget funktioniert, allerdings ziehe ich persönlich curl vor, da curl relativ mehr Funktionen bietet und auch von meinem Hoster empfohlen wird.

Wer sich auskennt, kann natürlich auch wget verwenden.

Um WordPress jede 30 Minuten nach Aufgaben überprüfen zu lassen, stellt man folgendes ein:

Eine gute Erklärung zur Terminierung von Cronjobs findet man auch im Wikipedia-Artikel zu Cronjobs.

Weitere Cronjobs mit WordPress

Jetzt kann es vorkommen, dass man mehrere Webseiten regelmäßig aufrufen möchte, aber der Hoster nur einen Cronjob erlaubt. Hier kann wieder WordPress weiterhelfen.

Mithilfe des Plugins Utopia Cron lassen sich weitere Cronjobs erstellen, die aber wieder auf dem Cronjob-System von WordPress basieren.

Das Plugin ist zwar schon etwas in die Jahre gekommen und wurde auch lange nicht mehr gewartet, aber es funktioniert noch unter WordPress 3. Man gibt einfach ein, welche URL nach welchen Zeitabständen aufgerufen werden soll. Alternativ kann man auch einen genauen Start-Zeitpunkt auswählen. Damit lassen sich dann auch Cronjobs zu jeder vollen Stunde etc. realisieren.

Hinweis: Aus Performance-Gründen lässt sich jede Webseite mit Utopia Cron nur maximal alle 5 Minuten aufrufen.

HinweisAus Performance-Gründen lässt sich jede Webseite mit Utopia Cron nur maximal alle 5 Minuten aufrufen.

Der Cronjob des Hosters sollte dann entsprechend dem Cronjob mit der kleinsten Terminierung angepasst sein.

Zusammenfassung:

Wenn man mehrere WordPress-Installationen oder andere Webseiten hat, die regelmäßig aufgerufen werden müssen, lässt sich das mit einem Cronjob (beim eigenen Hoster oder kostenlosen Cronjob-Anbieter) und einer WordPress-Installation realisieren.

Dazu fügt man in der wp-config.php die entsprechende Zeile hinzu und installiert das Plugin Utopia Cron. Dann richtet man einen Cronjob auf die wp-cron.php von WordPress ein und in den Plugin-Einstellungen benennt man jede weitere Webseite, die aufgerufen werden soll.

Fertig.

Wenn dir diese Anleitung geholfen hat, oder du noch Fragen zur Einrichtung hast, würde ich mich über einen Kommentar freuen.


Beitrag veröffentlicht

in

von

Schlagwörter:

Kommentare

16 Antworten zu „WordPress auf echten Cronjob umstellen“

  1. Avatar von Julia
    Julia

    Hallo, erstaml ein Lob für den ausführlichen Artikel.

    Ich bin darauf gestoßen weil mich mein Hoster angeschrieben hat und mitteilte das meine wp-cron.php den Server überlasten würde. Leider habe ich KEINE Ahnung was genau die von mir wollten.

    Jetzt habe ich einfach mal den Code in die config eingefügt und will schauen ob es was gebracht hat. Ist es schlimm wenn man nur den Code einfügt?
    Mein Hoster stellt auch Cronjobs zur Verfügung. Bringt die Nutzung dieser eine Serverentlastung oder Belastung?
    Besucher sind ausreichend da. Was sollte ich tun?

    Ich habe auch das Plugin Crontrol installiert um zu sehen was alles da ist aber da sind nur die Standard einträge?

    Auf meine Frage bei Hoster was das Problem wäre wurde mir eine email geschickt in der ich wirklich KEINEN Satz verstanden habe.

    Hoffe einfach mal das es hilft.

    1. Avatar von Artur

      Hallo Julia,

      freut mich, dass dir mein Artikel gefallen hat.

      Wenn du die Cronjobs einfach nur abstellst, ohne einen echten Cronjob einzurichten, dann sucht WordPress nicht mehr nach Updates für den Core, die Plugins und die Themes. Das kann auf lange Sicht fatal werden und ist deshalb nicht zu empfehlen.

      Du solltest dann lieber auch das Angebot deines Hosters nutzen und dir einen echten Cronjob einrichten.

      Wenn Core Control nur die Standard Einträge anzeigt, kann die wp-cron.php eigentlich nicht an der Überlastung schuld sein, da diese nur 2mal am Tag geprüft werden.

      Um zu verstehen, was dein Hoster genau meint, müsste ich mir schon die Email ansehen.

  2. Avatar von Sandra
    Sandra

    Hallo Artur,
    ich bin über das WP Forum auf Deinen Artikel gestossen und habe mir nach Deiner Beschreibung einen Cronjob eingerichtet.

    Im Logfile waren die bisherigen Aufrufe von WordPress immer ein POST Request.
    Nachdem nun der neue Cronjob das erste Mal gelaufen ist, sehe ich Logfile statt POST einen GET Request.

    Woher weiss ich nun, ob das so okay ist und WordPress richtig funktioniert?

    Ich bin da etwas unsicher, da ich mich mit Cronjobs nicht so gut auskenne und nicht so viel Hintergrundwissen habe.

    Besten Dank für Deine Antwort

    VG
    Sandra

    1. Avatar von Artur

      Hallo Sandra,
      schön, dass dir mein Artikel geholfen hat.

      Die Änderungen der Methode hat folgende Ursache:
      Normalerweise wird die wp-cron.php innerhalb von WordPress mit der Funktion wp_remote_post() aufgerufen. Diese Funktion erzeugt den http-Aufruf mit der Post-Methode. curl, das du beim Einstellen des echten Cronjob eingerichtet hast, erzeugt den request mit der GET-Methode.
      Für WordPress ist aber unerheblich, wie die wp-cron.php aufgerufen wird.

      Du kannst nachsehen, ob die WordPress-Cronjobs ausgeführt werden, indem du dir das Plugin Cron GUI installierst.
      https://wordpress.org/extend/plugins/cron-view/
      Unter Werkzeuge -> What’s in Cron? kannst du dann sehen, wann die nächsten Cronjobs anstehen und ob diese nicht in der Vergangenheit liegen.

      1. Avatar von Sandra
        Sandra

        Hallo Artur,

        vielen Dank für Dein Feedback und Deine Erklärung.

        Ich werde es probieren und mit dem Plugin kontrollieren.

        VG
        Sandra

  3. Avatar von Kim

    ah perfekt! das ist wirklich besser… ich nutze das Newsletter-Plugin, und das setzt wohl seit ner neuen Version auf diesen ominösen wp-cronjob 😉

    Kim

  4. Avatar von El Contento

    Hallo Artur,

    wenn ich deinen Artikel richtig verstanden habe, dann kann die wp-cron.php und ein fehlender echter Cronjob ein Grund sein, warum Seiten nicht in den Index aufgenommen werden?

    Ich hatte jetzt den Fall, dass ich über die Webmaster Tools eine hohe Crawling Aktivität sehen/ nachweisen konnte, aber nicht eine Seite indexiert wird. Ich dachte, dass durch die zu hohe Crawling Frequenz eventuell der GoogleBot ausgesperrt wurde.

    Ich würde mich über eine Antwort freuen.

    1. Avatar von Artur

      Hallo,

      nein, die wp-cron.php hat nichts mit der Indexierung durch einen Suchmaschinen-Bot zu tun. Die wp-cron.php ist im Normalfall nirgendwo verlinkt und kann gar nicht von einer Suchmaschiene gefunden werden. Sie wird nur intern von WordPress selber aufgerufen.

      Selbst wenn mal eine Suchmaschiene zur Datei einen sollte, so erzeugt diese im Normalfall gar keinen Output, der indexier werden könnte.

      Und was genau meinst du mit aussperren? WordPress selber sperrt niemanden aus, nur weil mehrmals massiv von einer Stelle aus die wp-cron.php aufgerufen wird.

  5. Avatar von Ivica Sacer

    Hallo Artur,
    vielen Dank für die ausführliche Beschreibung. Leider hast Du nicht geschrieben an welcher Stelle ich in der cofig.php den Code: define(‚DISABLE_WP_CRON‘, true); einfügen soll.

    Freue mich auf Deine Antwort.

    Grüße

    Ivica Sacer

    1. Avatar von Artur

      Hallo Ivica.

      Grundsätzlich ist die Position dieser Zeile innerhalb der wp-config.php egal, solange sie über der Zeile mit dem Kommentar „/* That’s all, stop editing! Happy blogging. */“ gesetzt wird.

      Ich habe es jetzt der Vollständigkeit halber oben dazu geschrieben. Danke für deinen Hinweis.

  6. Avatar von Ivica Sacer

    Hallo Artur,
    vielen Dank das hat jetzt geklappt allerdings habe ich ein anderes Problem. Ich lade mir das cron-view Plugin hoch aber es erschein als cron-gui und wenn ich es aktiviere erscheint es nicht in den Einstellungen so das ich das Plugin nicht aufrufen kann.

    Ich arbeite mit der aktuelle WordPress Version.

    Woran liegt das.

    Bitte um Hilfe.

    Grüße

    Ivica

    1. Avatar von Artur

      Das Plugin ist leider inzwischen etwas in die Jahre gekommen.
      Nach dem Aktivieren findest du es unter Werkzeuge -> What’s in Cron?

  7. Avatar von Ivica Sacer

    Hallo Artur,
    muss man hier: curl -Iso /dev/null http://www.example.com/wp-cron.php dann die eigene Domain ersetzen?

    Grüße

    Ivica

    1. Avatar von Artur

      Ja, hier muss die Domain und der Pfad zu deiner wp-cron.php angegeben werden.

  8. Avatar von Freiburgbärin

    Grüß Gott, Artur

    da in der aktuellen WP Version der von Dir genannte Suchstring nicht mehr existiert, habe ich das DEFINE direkt nach dem ersten Kommentar, außerhalb der ersten Funktion gesetzt. Bisher läuft mein Blog.
    Ein Eintrag in der crontab mit wget sieht so aus:
    */10 * * * * /usr/bin/wget -O - -q -t 1 http://www.example.com/wp-cron.php
    Alle 10 Minuten wird die wp-crontab aufgerufen.
    Ich danke Dir für die hier stehenden Tipps, die haben gut geholfen. (Meine Blogroll ließ sich nicht mehr in akzeptabler Zeit aufrufen.) Mit cron scheint dieser Missstand behoben.
    Römisch katholische Inhalte findest Du auf meiner Seite, in der Blogroll weitere katholische Blogger, die alle bibeltreu sind.

    Liebe Grüße

    Freiburgbärin

    1. Avatar von Artur

      Schön, dass dir der Artikel geholfen hat.

      Und danke für deinen Hinweis zu wget. 🙂