Über den Author / Internet / WordPress WP-Cron Probleme finden und beheben

WordPress WP-Cron Probleme finden und beheben

~4 Min. Lesezeit

Einleitung

Ob bei WordPress die Pingbacks und Trackbacks nicht ankommen oder rausgehen, die Probleme können an vielen Orten angesiedelt sein.

Oft hängt es mit dem Memory Limit zusammen, aber immer wieder beobachte ich auch Probleme vereinzelter Usern wegen der Max Execution Time.

Server Vorgaben

Das Memory Limit definiert, wie viel RAM Speicher der PHP Aufruf benutzen darf, bevor dieser abgebrochen wird.
Weiterhin, setzt das Max Execution Time die Zeit, welcher maximal vom PHP Prozess verwendet werden darf. Dies ist oft ein Schutz, das kein Skript unendlich läuft und damit unnötig viel Last auf einem Server erzeugt.

WordPress Funktionsweise

WordPress arbeitet diverse Aufgaben im Hintergrund ab, ohne den User damit zu benachrichtigen. Diese Verarbeitung erfolgt in dem sogenannten WP-Cron.

Pupliziert man zum Beispiel ein Artikel, wird über den WP-Cron alle Trackbacks und Pingbacks verschickt, alle Update Services benachrichtigt über den neuen Artikel, gegebenenfalls Artikel an Twitter und Facebook weitergeleitet und so weiter…

Diese Arbeiten arbeitet WordPress immer wieder ab im Hintergrund und lässt den User davon wenig merken. Das Problem dabei ist, gibt es ein Problem, wird der User auch nicht darüber informiert.

Symptom

Heute läuft Alles wie erwartet, Morgen wieder nicht mehr, 2 Tage später läuft es wieder. Die Probleme kommen und gehen, man merkt einfach das gelegentlich Trackbacks und Pingbacks nicht ankommen, oder gewisse andere Services nicht funktionieren wie gewünscht.

Warum kommt es zu einem Problem

Das Problem ist mit den oben genannten Einstellungen.

Sagen wir, wir haben 256 MB Ram und 30 Sekunden Max Execution Time.
Alles läuft gut, bis wir wiedermal ein neuen Artikel veröffentlichen welcher viele Text und Links beinhaltet. WP wird nun alle Dienste im Hintergrund aktivieren und versucht eine Menge externer Dienste zu benachrichtigen.

Unterdessen wurde der Artikel gespeichert und veröffentlicht, doch im Hintergrund versucht WordPress den ersten Trackback abzusetzen, doch der Server braucht 6 Sekunden für eine Antwort. WordPress informiert einen nach dem Anderen, doch nach dem 6ten Dienst, sind 30 Sekunden um, worauf PHP die Verarbeitung abbricht. Schon stehen Arbeiten in der Queue die nicht zu Ende bearbeitet wurden.

Noch viel schlimmer, gleich paar Minuten drauf steigt die Serverlast auf dem Server was es verunmöglicht irgend ein Dienst in Zeit zu beenden oder ein Update Service ist nicht erreichbar und bringt sogar ein Timeout nach 30 Sekunden. Dann stehen alle Hintergrundarbeiten an und verstopfen die Queue.

Neue Arbeiten (Statplugins oder Cacheplugins und vieles mehr) stellen ihre eigenen Hintergrundarbeiten an und die liste wird länger und länger.

Irgendwann meldet sich der Dienst zurück, oder in der Nacht wo der Server weniger belastet ist, schafft er es ein paar Arbeiten abzuarbeiten, solange bis wieder die 30 Sekunden um sind. Da aber die anstehenden Tasks definitiv länger benötigen, muss dies über mehrere Aufrufe abgearbeitet werden und zieht sich in die Länge. Schafft er es bis am Morgen, geht wieder alles seinen Gang, wenn nicht, hat man noch mehr offene und anstehende Arbeiten, die vielleicht nach paar Tagen durchgelaufen sind.

Lösung

Das Problem ist definitiv nicht WP-Cron. Diesem Dienst hat man zu verdanken das WordPress so einfach und genial in der Bedienung ist und viele Hintergrunddienste ohne Zutun abgearbeitet werden.

Entweder man kann versuchen die Einstellungen vorzunehmen siehe hier oder man richtet sich ein richtigen Cronjob auf dem System ein (Kann bei dem Hoster beantragt werden).

Sobald man den Cronjob eingerichtet hat, oder auch vorher kann man die Cron Funktionalität deaktivieren:
Dazu setzen wir folgende Zeile in die Datei wp-config.php:

define('DISABLE_WP_CRON', true);

Ich zum Beispiel lasse sie aktiviert und richte parallel ein Cronjob ein, so nimmt es die interne Abarbeitung wenn möglich, falls er mal in ein Problem rennt, den Cronjob zur Abarbeitung (Batzen und das Weckli).

Den Cronjob kann man anschliessend ausführen wenn man im Web http://www.deinedomain.ch/wp-cron.php aufruft. Leider erhält man da eine weisse Seite, egal ob es gut verlaufen ist, oder Fehler erzeugt hat. Man bekommt nie Gewissheit.

Um Gewissheit zu haben, müsste man auf der Shell den Befehl aufrufen:

/usr/bin/php5 -q /dein/pfad/zu/wordpress/dinedomain.ch/blog/wp-cron.php

Keine Ausgabe heisst alles ging gut. Eine Ausgabe wie diese zeigt euch das Problem:

PHP Fatal error: Allowed memory size of 262144 bytes exhausted (tried to allocate 261900 bytes) in Unknown on line 0
Could not startup.

Da die dateien die Per Web oder Console aufgerufen werden dennoch die limits gesetzt haben, brauchen wir eine Ausnahme oder ein Trick.

Dazu brauchen wir eine Ausnahme, ob euer Hoster dies macht, steht in den Sternen, doch dies ist noch kein Untergang.

Keine Ausnahme vom Hoster
Will euer Hoster dies nicht, richtet ihr am Besten ein Cronjob all 5 Minuten ein:

wget http://www.deinedomain.ch/wp-cron.php > /dev/null 2>&1

Selbstverständlich kann auch Curl verwendet werden anstelle wget oder jedes andere Tool.
Dieser Trick kann euch nur beim Max Execution Time helfen, in dem er versucht ein Zeitslot zu finden wo er den Job abarbeiten kann, bevor er abbricht und dann die Nächsten startet. Habt ihr Memory Limit Probleme, seit ihr aufgeschmissen und müsst betteln oder den Hoster wechseln.

Ausnahme einrichten
Dazu müssen wir eine Kopie machen von einer bestehenden php.ini Datei auf dem Server und legen die Kopie als /etc/php5/neuesphp.ini ab.
In dieser Datei, ändern wir nun 2 Einträge ab wie folgt:

memory_limit = -1
max_execution_time = -1

Und anschliessend folgenden Cronjob

/usr/bin/php5 -c /etc/php5/neuesphp.ini -q /dein/pfad/zu/wordpress/dinedomain.ch/blog/wp-cron.php > /dev/null 2>&1

Welcher wir alle 30 Minuten laufen lassen.

Hat alles geklappt, wird bald wieder alles seinen gewohnten Gang gehen und WordPress funktioniert wieder!

About Stefan

avatar
Ein männlicher IT Nerd, durchstöbert das Web nach speziellen Gadgets, unentbehrlicher Software und Alles was man im IT Sektor nicht verpassen darf.Immer hilfsbereit wenn Probleme zu lösen sind oder das Unmögliche umgesetzt werden sollte.

Weitere interessante Artikel

PHP Trojaner (Teil 4: Codierte Uploader Infektion)

~2 Min. LesezeitNicht jeder PHP Trojaner kann auf den ersten Blick identifiziert werden, was der …

PHP Trojaner (Teil 3: Spamsender Infektion)

~1 Min. LesezeitSpam ist ein grosses Problem der heutigen Zeit, doch wer verschickt Spam und …

3 Kommentare

  1. avatar

    Und für alle die bei all-inkl.com sind kann man den Befehl unter ‚Keine Ausnahme vom Hoster‘ wie folgt verpacken (gerade beim Support nachgefragt):

    Sie können derartige Befehle innerhalb des Exec-Befehls ausführen. Legen Sie dazu eine PHPX-Datei (z.B test.phpx) an. In diese Notieren Sie folgendes:

    <?php
    exec("wget http://www.deinedomain.ch/wp-cron.php >  /dev/null 2>&1");
    ?>
    

    Natürlich ohne die Leerzeichen 🙂

  2. avatar

    Hoi Markus

    Jein, auch da wieder das Problem, wget öffnet nichts anderes als die Datei über Apache wo die Limiten weiterhin aktiv sind. Dann würde ich eher den Exec Befehl nutzen mit Lösung 2.

    <?
    exec("/usr/bin/php -c /dein/pfad/zu/wordpress/dinedomain.ch/blog/neuesphp.ini -q /dein/pfad/zu/wordpress/dinedomain.ch/blog/wp-cron.php > /dev/null 2>&1");
    ?>
    

    Einfach mal versuchen 😉

  1. Pingback: Pingbacks funktionieren nicht! – webcoach – Tipps & Tricks

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

eMail-Benachrichtigung bei weiteren Kommentaren.
Auch möglich: Abo ohne Kommentar.

This Blog will give regular Commentators DoFollow Status. Implemented from IT Blögg