Sollte ich WP_CRON deaktivieren und stattdessen alle paar Minuten wp-cron.php vom Server auslösen?

12

Es sieht so aus, als würde WordPress bei jedem Laden der Seite unnötigerweise WP CRON auslösen. Ich denke, anstatt es bei jedem Besuch laufen zu lassen, warum nicht einfach alle 5 Minuten über den Server laufen lassen? Ich könnte einfach alle fünf Minuten wp-cron.php auslösen und das gewünschte Ergebnis erzielen.

Gibt es irgendwelche Nachteile?

TheBigK
quelle

Antworten:

15

Es gibt keinen Nachteil, WP CRON mithilfe der Cron-Jobs des Servers auszuführen. In der Tat ist dies die empfohlene Praxis.

Laut offiziellem WordPress Plugin Development Document :

WP-Cron wird nicht kontinuierlich ausgeführt. Dies kann ein Problem sein, wenn wichtige Aufgaben rechtzeitig ausgeführt werden müssen. Hierfür gibt es eine einfache Lösung. Richten Sie einfach den Taskplaner Ihres Systems so ein, dass er in den gewünschten Intervallen (oder zum gewünschten Zeitpunkt) ausgeführt wird.

Dazu müssen Sie zuerst das Standard-Cron-Verhalten deaktivieren in wp-config.php:

define('DISABLE_WP_CRON', true);

Planen Sie dann wp-cron.phpvon Ihrem Server aus. Für Linux bedeutet das:

crontab -e

Führen Sie es jedoch nicht in der Befehlszeile (CLI) aus, sondern als HTTP-Anforderung. Dafür können Sie verwenden wget:

*/5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron

WordPress lädt alle erforderlichen Kerndateien, Plugins usw. wp-cron.phpmit dem folgenden CODE:

if ( !defined('ABSPATH') ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

Machen Sie sich also keine Sorgen, dass WordPress keine wichtigen Funktionen lädt.

Fayaz
quelle
1
WordPress.org-Dokumentation, die Sie wget http://YOUR_SITE_URL/wp-cron.phpohne Erwähnung mit Erwähnungen verknüpft haben. ?doing_wp_cron Ist also eine besser als die andere? Was macht das Hinzufügen von ?doing_wp_cron, was die Nicht-Version nicht tut?
Garconis
Wahrscheinlich nur, damit in Ihren Protokollen die Abfragezeichenfolge angezeigt wird, damit Sie sicher wissen, wie sie aufgerufen wurde.
Slbox
1
Dem stimme ich überhaupt nicht zu. Erstens ist es nicht wahr, dass es "empfohlen" wird. Zweitens lähmt diese Methode alle Plugins, die die tatsächlich empfohlene Methode zum Planen von Ereignissen verwenden. Ich denke, das ist wirklich ein schlechter Rat. Fast niemand sollte den Cron ausschalten, es sei denn, Sie haben einen SEHR spezifischen Grund dafür. Der einzige Grund, an den ich denken kann, ist, wenn Sie WordPress für ein CDN oder so etwas auflösen. Dies ist keine normale Praxis.
John Dee
1
@JohnDee: Diese Methode deaktiviert Cron nicht. Sie deaktiviert die WP Cron-Methode, die Cron-Jobs bei jedem Seitenladevorgang überprüft und versucht, sie auszuführen. define('DISABLE_WP_CRON', true);Deaktiviert nur diesen Teil des Cron-Prozesses und ruft dann das Cron-Skript mit dem folgenden Code auf: */5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cronAuf dem Server wird sichergestellt, dass Cron-Jobs ausgeführt werden. Jedes Planungs-Plugin kennt nicht einmal den Unterschied.
Fayaz
1
Der Link zur Dokumentation von WordPress.org zu diesem Thema wurde in developer.wordpress.org/plugins/cron/…
aldemarcalazans
2

Es gibt ein paar Nachteile: Erstens, wenn Sie wp-cron.php als CLI verwenden, werden Dinge wie $ _SERVER-Variablen nicht festgelegt. Menschen überwinden diese Einschränkung, indem sie stattdessen eine Curl-Anfrage an wp-cron.php verwenden.

Zweitens, weil WP selbst nicht mit wp-cron.php geladen ist; Wenn Sie ein SMTP-Mailer-Plugin verwenden, wird dieses beim Aufruf von wp-cron nicht geladen. Die Verwendung eines Curl-Aufrufs überschreibt dieses Problem erneut. Curl scheint die am häufigsten verwendete Methode zu sein.

Jedoch; Ich bevorzuge die Verwendung von wp-cli, nachdem ich die Mail-Einstellungen in postfix und (für nginx) php-fpm config korrekt festgelegt und eine crontab wie z

*/5    *   *   *   *  wp cron event list --skip-plugins --skip-themes --path="/var/www/vhosts/example.com/httpdocs/wp" --fields=hook,next_run_relative --format=csv | awk -F, '$2=="now" {print $1}' | xargs -r wp --path="/var/www/vhosts/example.com/httpdocs/wp" cron event run $1

(Listen Sie alle Crones mit bestimmten Feldern im CSV-Format auf - Hook ist der Name des Cron, der nächste relative Lauf ist die Zeit. Entfernen Sie diejenigen, die "jetzt" als nächsten Lauf (die jetzt fällig sind) mit AWK anzeigen, und übergeben Sie diese Liste an xargs an Rufen Sie wp cron event run $HOOKjedes Cron auf.) Wenn Sie wp-cli verwenden, wird WordPress korrekt geladen. (Ich überspringe Plugins, wenn ich die Cron aufführe, da Code-Erros und PHP-Warnungen die Skriptausgabe vermasseln, aber nicht überspringen, wenn das Cron mit xargs ausgeführt wird Für den Cron müssen möglicherweise die Plugins geladen werden.

Ich hoffe, dies gibt Ihnen einige Hinweise, worauf Sie achten müssen.

TechnicalChaos
quelle
2
Wie wäre es mit der Einrichtung von: / 15 * * * wget -q -O - yourdomain.com/wp-cron.php?doing_wp_cron, wie von TomMcFarlin vorgeschlagen - tommcfarlin.com/wordpress-cron-jobs . Scheint den Job gut zu machen. Würde mich über deinen Kommentar freuen.
TheBigK
Ja, wie ich bereits erwähnt habe, verwenden die Leute Curl (wget oder einen anderen http-Aufruf), um die Crones auszulösen, und an dieser Methode ist nichts auszusetzen. Ich habe nur die Probleme beim direkten Aufrufen der wp-cron-PHP-Datei empfohlen, die die erforderlichen Dateien nicht enthalten würde, und eine andere alternative Methode empfohlen, wenn Sie sie etwas aufpeppen möchten.
TechnicalChaos
0

Es gibt viele Gründe, den wp-cron nicht zu deaktivieren. Tatsächlich ist es fast unmöglich, einen Anwendungsfall dafür zu finden. Es verlangsamt Ihre Website nicht und wird für Dinge verwendet, die Sie möglicherweise nicht kennen.

Viele Plugins verwenden das WP-Cron, um Dinge zu planen. Sie können verwirrt werden, wenn Sie den Scheduler ausschalten.

Es gibt eine Vielzahl von Tutorials zu diesem Thema, weil es verwirrend ist und weil es Ihrer Website nicht viel bringt, wenn Sie es deaktivieren. Was es tun wird, ist, dem Entwickler Kopfschmerzen zu bereiten, der das mysteriöse Problem beheben muss, das es in sechs Monaten verursacht.

Außerdem wird der WP Heartbeat alle 15 Sekunden im Admin-Bereich ausgelöst, wodurch dieses Problem für 99% der Personen behoben wird, die glauben, es zu haben.

John Dee
quelle
1
Dies ist eine schreckliche Reaktion - sie deaktivieren WP Cron NICHT. Sie deaktivieren lediglich den Aufruf von WP Cron beim Laden von Seiten und laden ihn stattdessen auf den System-Cron-Daemon. Meine Güte.
Barry Chapman
Der Hauptgrund, es in Ruhe zu lassen, ist, dass viele Plugins das Cron jetzt für erweiterte Hintergrundaufgaben verwenden. Sie können etwas durcheinander bringen, was die NÄCHSTE Person tut, weil sie erwartet, dass das System auf normale Weise funktioniert. Viel Glück!
John Dee
0

Ich muss noch einen echten Nachteil finden, wenn ich wp-cron an einen externen Dienst auslagere. Das schon seit vielen Jahren.

Besonders in der heutigen Welt, in der Sie Anwendungen als Microservices ausführen können.

Ich verwende separate Docker-Container für jede WordPress-Komponente (PHP, Web, DB, Crontab, Redis usw.). Crontab als separaten Container haben, wp-cron über http über ein lokales Netzwerk aufrufen und nur dann ausführen, wenn ich es brauche.

Dies reduziert die Belastung der Backend-Knoten und verbessert die Sicherheit durch eine kleinere Angriffsfläche.

Wenn der Entwickler nicht herausfinden kann, wie man Dinge macht, ohne wp-cron bei jedem Laden der Seite aufrufen zu müssen, spricht dies nur für Unerfahrenheit in seinem Namen. "Lass es in Ruhe", weil du nicht verstehst, wie die Dinge funktionieren, ist kein guter Grund, es zu behalten.

Radoslav Stefanov
quelle