Nächster Lauf

Registrierte Domains

Was ist ein Cron?

Der Cron-Deamon ist ein Dienst der zeitbasiert Prozesse startet. Im Kontext von Webanwendungen ist das oft ein PHP Skript. Der sogenannte Cronjob wiederholt die Ausführung periodisch.

WordPress implementiert sein eigenes Cron System. Es funktioniert nach der Installation ohne weitere Serverkonfiguration. Dabei wird bei jedem Aufruf der Website ein HTTP Request an wp-cron.php gesendet und die Scheduled Events aus dem Core und den Plugins durchlaufen. So werden z.B. geplante Artikel veröffentlich, Pingbacks ausgelöst oder nach Updates geschaut.

Diese Implementierung des WP-Crons hat einen guten Grund. WordPress ist das meist genutzte CMS der Welt. Der Marktanteil liegt bei etwa 50% (58% w3techs.com, 44% in Deutschland www.cmscrawler.com Stand Mai 2017). Viele dieser User betreiben keine professionellen Websites, sondern sind Hobby-Blogger und wollen/können deshalb keine proffessionellen Server bezahlen. Damit die Scheduled Events auch auf Billighostings funktionieren, die zumeist keine echten Cronjobs anbieten, ist eine solche besucherrequestbasierte Implementierung sinnvoll.

Probleme des WordPress Cron Systems

Der WordPress pseudo Cron hat aber einige erhebliche Nachteile, weswegen er nach Möglichkeit durch einen echten Cronjob ersetzt werden sollte.

Als erstes ist er nicht zuverlässig. Wenn kein Besucher auf die Seite kommt dann wird kein Prozess gestartet. Das bedeutet keine geplanten Artikel werden veröffentlicht, keine Systemupdates, keine Pingbacks und nichts passiert regelmäßig. Die Funktionalität ist komplett ausgeschaltet.

Bei gut besuchten Webseiten steigt die Severlast. Denn die ausgelösten Requests pro Besucher werden verdoppelt und jedes mal eine Cron Lock Variable aus der Datenbank angefragt. Das ist an sich zwar keine aufwendige Operation, kann in der Summe dennoch performance fressen. Im besondern bei Websiten die zusätzlich Ajax-Requests an System senden.

Als letztes ist es schlicht und einfach nicht die Aufgabe eines Besuchers einen Prozess anzuschmeißen, der vermutlich gar nichts mit der eigenen Intention seines Besuchs zu tun hat. Das ist der Job eines echten Cronjobs!

Wie optimiere ich die WP-Crons?

Zunächst sollten die Besucher keine HTTP Request mehr an die wp-cron.php auslösen. Dazu wird in der wp-config.php die Konstante DISABLE_WP_CRON definiert.

define('DISABLE_WP_CRON', true);

Im zweiten Schritt wird ein Cronjob erstellt, der die wp-cron.php aufruft.

0 * * * * wget http://domain.tld/wp-cron.php

Oder

0 * * * * php /pfad/zum/docroot/wp-cron.php > /dev/null 2>&1

Für Multisite installationen wird wp-cli benötigt.

* * * * wp cron event run --path=/pfad/zum/docroot --url=www.domain-of-site.tld --due-now

Falls das Hosting keine Crons anbietet kann man den Service auf dieser Seite nutzen.

Zusammenfassung

Was macht der WP-Cron?

Nachteile des WP-Cron-Systems: