WordPress: WP-Cron begrenzen
30.01.2010 in: Webdesign und Wordpress
So sehr ich WordPress auch schätze – einige Macken gehen mir tüchtig auf die Nerven. Dazu gehören auch die vielen Requests auf wp-cron.php?doing_wp_cron.
Solch ein Request wird bei (fast?) jedem Aufruf einer Seite oder eines Artikels angestoßen. Zwar werden dabei kaum Daten übertragen, aber ein bißchen Zeit kostet es eben doch, und das Logfile wächst ohne Not.
Ich habe mir deshalb in die Konfigurationsdatei wp-config.php diese kleine Einschränkung eingetragen:
if ( 0 < (time() % 10) )
{
define('DISABLE_WP_CRON', TRUE);
}
Zu Deutsch: Wenn sich der aktuelle, in Sekunden gemessene UNIX-Timestamp nicht genau durch 10 teilen läßt, verzichte ich auf WP-Cron.
Damit funktionieren noch die Kontrollen auf neue Plugin- oder WordPress-Versionen, doch die Menge der Requests schrumpft dramatisch. Wer noch weniger Aufrufe haben möchte, der erhöhe einfach den Teiler.
Natürlich könnte man die Pseudo-Cronjobs auch einfach komplett abschalten und einen richtigen Cron benutzen. WordPress sendet aber einen POST-Request, dessen Zusammensetzung ich nach jedem Update neu überprüfen müßte, um den echten Cron entsprechend anzupassen. Das ist mir zu umständlich.
Einen guten Überblick über die anstehenden Cronjobs bekommt man mit dem Plugin Cron View. Das sieht dann ungefähr so aus:

Wer gerne Plugins ausprobiert, sollte sich das unbedingt mal ansehen, denn nicht jeder Autor schreibt eine saubere Deinstallation.
Prüft wp-cron lediglich auf evtl. vorhandene Updates der Plugins und des Kernprogramms? Dann kann man das doch gleich abschalten.
@David: Auch Plugins können diese API benutzen, etwa zum regelmäßigen Backup oder für Terminkalender. Und wenn du einen Beitrag erst in der Zukunft veröffentlichen möchtest, wird ebenfalls WP-Cron benutzt.
Wenn wirklich nur Plugins und Core geprüft werden, dann kannst du es abschalten, wenn es in deiner lokalen Kontrollinstallation noch angeschaltet ist.
Ich werde deinen Vorschlag gleich mal umsetzen! Hört sich jedenfalls sehr sinnvoll an!
Hmm wie wäre es, wenn du die cronjobs nur zu bestimmten Zeiten ausführen lässt, anstatt Sekunden mod 10 = 0 zu nutzen? Dazu müsstest du lediglich irgendwo abspeichern, wann das letzte mal der "cronjob" ausgeführt wurde.
@Patrick: Das kann man auch machen, beispielsweise so:
// Cron nur in der vorletzten Stunde des Tages if ( 22 != (int) date('H') ) { define('DISABLE_WP_CRON', TRUE); }Zu eng darf man den Zeitraum bei schwach besuchten Seiten nicht fassen, denn der WP-Cron startet nur bei einem externen Request. Und ich würde ihn lieber nicht auf eine Zeit legen, die von der Zeitumstellung berührt wird.