Wordpress Performance Wordpress SEO Wordpress Security Wordpress Themes Wordpress Hosting Mein Setup Das Buch

Cronjob statt wp-cron.php

Cronjob statt wp-cron-php

Was macht die wp-cron.php

Schon lange wollte ich noch einmal ausführlicher über die sogenannte wp-cron.php berichten, die in WordPress für geplante bzw. immer wiederkehrende Aufgaben zuständig ist. Eigentlich ist die wp-cron.php wie ein Cronjob, der dafür sorgt, dass zu einer bestimmten Zeit, eine bestimmte Aufgabe gestartet wird. Aber nur eigentlich, denn in Wahrheit ist genau dass das Problem der Sache – die wp-cron.php ist kein echter Cronjob. Stattdessen wird die wp-cron.php bei jedem (!) Seitenaufruf abgefragt und prüft dann, ob  Aufgaben vorhanden sind, etwa ob Beiträge geplant wurden, die jetzt veröffentlicht werden sollen, oder ob ein Plugin irgendwelche Arbeiten automatisiert erledigt. Das mag grundsätzlich kein Problem sein und auf die meisten kleinen WordPress Blogs kaum Auswirkungen haben, ist gerade bei größeren Seiten dann aber doch kritischer zu sehen. Performant ist das Ganze nämlich auf gar keinen Fall und so bremst es die Leistung eurer Website aus.

wp-Cron.php als Performance-Bremse

Das liegt schon daran, dass die Aufgaben in der Datenbank gespeichert werden, weshalb die wp-cron.php natürlich auch auf dieses zugreifen muss. Das erzeugt unnötige Anfragen und noch unnötiger ist, dass die wp-cron.php bei jedem Seitenaufruf prüft, ob geplante Aufgaben vorhanden sind, somit also auch immer einen HTML Request generiert. Immer und immer wieder. Ich brauche hier nun gar nicht so sehr in technische Details versinken, weil jedem, wirklich jedem klar sein sollte, dass ein ständiger Aufruf und eine ständige Kontrolle nach geplanten Aufgaben vollkommen sinnlos ist. Genau das soll die wp-cron.php im Kern schließlich verhindern, denn sie dient doch eigentlich dafür, bestimmte Routinen nur alle 60 Minuten etc. abzuarbeiten, statt Aufgaben andauernd zu starten. Weil das so aber eben nicht möglich ist, stellt die wp-cron.php eine permanente Belastung für die Performance da. Wie gesagt: Für kleine Blogs oft nicht von Bedeutung, mit hohen Zugriffszahlen aber schnell ein nicht zu unterschätzendes Problem. Um das alles zu optimieren, sind im wesentlichen zwei Schritte notwendig.

wp-Cron.php mit Cronjob ersetzten

Im ersten Schritt wird nun zunächst die die wp-cron.php in WordPress komplett deaktiviert, sodass diese nicht bei jedem Seitenaufruf gestartet wird. Danach folgt der manuelle Aufruf nach Zeit per Cronjob, sodass die Aufgaben innerhalb der wp-cron.php weiterhin abgearbeitet werden, aber nur noch zu gewissen Zeiten und nicht mehr am laufenden Band. Wie das geht, erfahrt ihr unten.

1. Das einzige was hilft ist nun, die wp-cron.php zu deaktivieren. Das verhindert deren Aufruf und spart Ressourcen, was natürlich wieder Performance einbringt und allgemein den Server etwas entspannen lässt. Doch ohne wp-cron.php gibt es auch keine geplanten Beiträge mehr, auch automatische Aufgaben werden dann nicht mehr abgearbeitet. Doch dafür gibt es eine Lösung, wie ich im nächsten Schritt zeige. Erst einmal deaktiviert ihr nun die wp-cron.php und zwar indem ihr folgendes in die wp-config.php (befindet sich im Hauptverzeichnis) hinzufügt und zwar direkt unter das “define(‘DB_COLLATE’, ”);”, weil es sonst Probleme geben kann oder der Wert nicht korrekt erkannt wird.

define('DISABLE_WP_CRON', true);

2. Als nächste muss nun auf dem Server selbst ein vollwertiger Cronjob eingerichtet werden. Dieser Cronjob ruft die wp-cron.php dann so oft auf wie ihr möchtet. Meiner Meinung nach reichen 30 Minuten vollkommen aus. Doch mal ein kleines Beispiel, um das Ganze zu verdeutlichen. Nehmen wir mal an, ihr plant einen Beitrag für 18:00 Uhr, der Cronjob startet den Aufruf aber erst um 18:30. Das Resultat: Der Beitrag erscheint 30 Minuten zu spät. Für die meisten Blogs ist das vollkommen irrelevant, weshalb die wp-Cron.php vom Cronjob auch so selten wie möglich aufgerufen werden sollte. 30 Minuten sind hier ein guter Mittelwert, wie ich finde, mit dem wohl jeder leben kann, der nicht auf sekundengenaue Veröffentlichungen angewiesen ist. Wer nie geplante Aufgaben nutzt und auch keine Plugins einsetzt die das tun, kann die Zeit noch weiter anheben. Grundsätzlich gilt: Je seltener die wp-cron.php letztendlich aufgerufen wird, umso besser. Wie euer Cronjob genau aussehen muss, richtet sich nach dem jeweiligen Anbieter. Fragt da am besten mal euren Hoster, der gibt euch dann entsprechende Infos. Bei Host Europe zieht die Wget-Methode.

wget -q -O - http://DEINE-DOMAIN.de/wp-cron.php?doing_wp_cron
>/dev/null 2>&1

Mehr Performance und Kontrolle

Vor einiger Zeit hatte ich euch diese Möglichkeit schon einmal beiläufig vorgestellt, nämlich im Artikel über Cachify und wie das Plugin mit HDD-Cache und geplanten Beiträgen genutzt werden kann. Allerdings empfinde ich das Abschalten der wp-cron.php als recht wichtig und wollte es daher auch noch einmal einzeln und etwas umfangreicher vorstellen. Bei mir entlastet die deaktivierte wp-cron.php das System jedenfalls recht stark und somit sind Ressourcen wieder für andere Aufgaben frei, statt sie mit unsinnigen Aufrufen der wp-cron.php zu verschwenden. Ob dies bei euch schon nötig ist, oder ob ihr den Umweg über einen echten Cronjob in Kauf nehmen möchtet, solltet ihr nun selbst entscheiden. Ich kann euch das Ganze nur empfehlen, denn die wp-cron ist auf nahezu jedem Blog viel zu ineffizient, als dass sie in Verwendung bleiben sollte. Ein Cronjob wirkt da wahre Wunder und schont das Hosting bzw. den Server. Probiert es doch mal aus. Im Zuge dessen, solltet ihr auch gleich noch einmal die wp-cron.php ausmisten, um verwaiste Einträge und Aufgaben sauber zu entfernen.



Wordpress Performance eBook