WordPress – WP-Cron mit Cronjob ersetzen

In WordPress wurde zum abarbeiten von geplanten Aufgaben eine Cronjob Funktionalität “WP-Cron” implementiert welche standardmäßig mit jedem Seitenaufruf einen POST Request auf das im Hauptverzeichnis liegende Script wp-cron.php generiert. Dieses Script verarbeitet geplante Aufgaben wie z.B: das publizieren von Beiträgen oder das steuern von Trackbacks, Pingbacks und führt diese quasi im Hintergrund aus. Aus diesem Grunde hat diese Funktionalität auch definitiv seine Daseinsberechtigung.

Bei stark besuchten WordPress Blogs kann es unter Umständen dadurch aber auch zu einer erhöhten Last oder schlimmer noch, zu Ausfällen des Blogs kommen. Um dem entgegen zu wirken ist es Ratsam WP-Cron in der wp-config.php, welche ihr ebenfalls im Hauptverzeichnis eurer WordPress Installation findet, mit der Zeile define('DISABLE_WP_CRON', true); oberhalb des Kommentars /* That's all, stop editing! Happy blogging. */ zu erweitern und damit die Cronjob Funktionalität zu deaktivieren:

define('DISABLE_WP_CRON', true);
/* That's all, stop editing! Happy blogging. */

Damit die geplanten Aufgaben auch weiterhin abgearbeitet werden können, muss ein echter Cronjob her. Die meisten Hoster bieten einen solchen Service an. Falls nicht kann man den kostenlosen Dienst von cronjob.de dafür in Anspruch nehmen, welcher in den meisten Fällen völlig ausreichen sollte. Das nun folgende Beispiel bezieht sich allerdings auf ein Linux System, sollte aber ähnlich auch bei eurem Hoster oder einem externen Cronjob Dienst funktionieren.

Bereits erstellte Cronjobs lassen sich mit dem Konsolenbefehl $ crontab -e anzeigen und anpassen:

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

Hier tragen wir nun mit einem einzeiler unseren Cronjob für die WordPress Installation ein:

...
# m    h  dom mon dow command
  */5  *  *  *  *  /usr/bin/php5 -q /var/www/rschu.me/public/wp-cron.php
 /usr/bin/php5

Mit dieser Zeile veranlassen wir alle 5 Minuten den Aufruf vom Script /var/www/meinblog.de/public/wp-cron.php, welches für die Abarbeitung der geplanten Aufgaben zuständig ist. Eine sehr gute Erklärung wie Cronjobs im Detail funktionieren findet ihr im Ubuntu Wiki, da dieses Thema wohl diesen Beitrag sprengen würde.

Damit sollte euer WordPress Blog weniger Last bei zu vielen gleichzeitigen Anfragen erzeugen und stabiler laufen.

Ein kleiner Tipp am Rande

Werden die geplanten Aufgaben trotz aktivierter Cronjob Funktionalität nicht abgearbeitet, kann die hier aufgeführte Methode wunderbar zur Findung von Fehlern herangezogen werden da der Aufruf wp-cron.php über den Browser leider keine Ausgabe sondern nur eine weiße Seite erzeugt. Der mir am häufigsten untergekommene Fehler ist das von WordPress gesetzte Memory Limit. Ein direkter Aufruf von wp-cron.php über die Shell könnte eine ähnliche Meldung wie diese erzeugen:

$ /usr/bin/php5 -q /var/www/rschu.me/public/wp-cron.php
PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 71 bytes) in /var/www/rschu.me/public/wp-includes/pomo/mo.php on line 221

Der einfachste Weg wäre hier über die WordPress Konstante WP_MEMORY_LIMIT den Speicher zu erhöhen. Dazu erweitert ihr die wp-config.php, auch wieder oberhalb des Kommentars /* That's all, stop editing! Happy blogging. */, mit der Zeile define('WP_MEMORY_LIMIT', '128M');. Das von euch zu definierende Speicherlimit (Bsp: 128M) ist abhängig von dem euch zur Verfügung stehenden Speicher. Am besten ihr fangt klein an und erhöht den Wert in kleineren Schritten bis der Fehler verschwunden ist.

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn