Verlangsamen WordPress-Cron-Jobs das Laden von Seiten?

8

Wenn ein Benutzer eine Site besucht und sein Besuch einen sehr intensiven Cron-Job auslöst, ist die Seitenladegeschwindigkeit für ihn langsamer, oder? Soweit ich weiß, wartet die Seite vor dem Laden nicht auf die Ausführung des Cron-Jobs. Da der Cron-Job jedoch parallel ausgeführt wird, wird die Seite möglicherweise immer noch langsamer geladen, da der Server ausgelastet ist, oder?

urok93
quelle
Informieren Sie sich über spawn_cron, das Ihnen helfen könnte: codex.wordpress.org/Function_Reference/spawn_cron
TomC
Wenn Ihr Cron-Job schwer genug ist, um den Server zu beschäftigen, ist er schwer genug, um den Server zu beschäftigen. Ich folge nicht ganz Ihrer Frage - um das zu bestätigen?
Erster
Ja, ich wollte das nur bestätigen, da ich gelesen habe, dass Seitenladevorgänge und Cron-Jobs unabhängig voneinander ausgeführt werden und der Seitenladevorgang daher nicht betroffen ist. Wenn der Cron-Job jedoch, wie Sie sagen, schwer genug ist, wirkt sich dies als Nebeneffekt auf das Laden der Seite aus.
urok93

Antworten:

10

Kurze Antwort - Nein . Jede Seitenanforderung initialisiert die geplante Warteschlange. Es ist nur eine Initialisierungsanforderung. Die Wp-Cron-Anfrage ist eine eigenständige Anfrage.

Wenn /somepageSie also eine URL anfordern , initialisieren Sie einfach die Anforderung an/wp-cron.php

Allerdings - Wenn das Cron-Ereignis nicht wirklich gut funktioniert (es hat 1000-dB-Abfragen, z. B. oder eine wirklich langwierige Ressource anzufordern) oder beides, oder wenn Sie das Cron-Ereignis für jede Anforderung neu planen ... genau wie bei jedem anderen Bei anderen http-Anforderungen werden Ressourcen, CPU-Leistung, Speicher usw. verbraucht. Wenn genügend Ressourcen verbraucht werden, wird Ihre Seite langsamer.

Oleg Butuzov
quelle
9

Die kurze Antwort lautet in den meisten Fällen tatsächlich Ja .

Erstens führt das Laichen eines Cron-Jobs bei den meisten Setups zu einer Verzögerung von 1 Sekunde beim Laden der Seite, da dies über eine Loopback-HTTP-Anforderung mit einem Timeout von 1 Sekunde erfolgt - siehe https://wordpress.org/support/topic/save -a-volle-Sekunde-auf-Cron-Ausführung / .

Zweitens konkurriert der erzeugte Job jetzt mit dem Laden der Seite um den Datenbankzugriff (sowie um andere Ressourcen). Mehrere Prozesse können die Datenbank gleichzeitig lesen. Wenn ein Prozess in die Datenbank schreibt, ist er standardmäßig gesperrt, um den gleichzeitigen Schreib- oder Lesezugriff eines anderen Prozesses zu verhindern - siehe /programming/1005206/does-sqlite-lock-the-database -file-on-read # answer-1005218 . Die Auswirkungen davon hängen davon ab, wie komplex die Datenbankaktualisierungen des Cron-Jobs sind und wie lange die Datenbank tatsächlich gesperrt ist und möglicherweise unbedeutend ist. Natürlich wäre es auch ein Problem, wenn ein Cron-Job zufällig ausgeführt würde, wenn eine Seite angefordert wird, aber Cron-Jobs beim Laden der Seite garantiert werden Sie wirken sich zumindest auf das Laden der Seite aus.

Wenn Ihr Server / Hosting dies zulässt, wird empfohlen, mit dem Befehl einen geplanten Cron-Job einzurichten, der alle paar Stunden ausgeführt wird

php -q /path/to/wp-cron.php

und deaktivieren Sie das Cron-Laichen beim Laden der Seite mit dem folgenden Eintrag in wp-config.php:

define('DISABLE_WP_CRON', true);
Jake
quelle
1
Das ist die wahre Antwort.
ILikeTurtles
Laut Artikel tritt die Verzögerung von 1 Sekunde bei cURL-Versionen unter 7.15.5 auf. Es funktioniert gut bei Curl-Versionen ab 7.15.5 und höher. 7.15.5 wurde im August 2006 veröffentlicht. Es gibt keine Zeitüberschreitung von 1 Sekunde mehr, außer bei wirklich sehr, sehr alten Setups.
user63350
@ user63350 Das gilt für cURL, aber nicht für WordPress. Aus dem Artikel: "Die Klasse WP_Http_Curl passt das gebrochene Zeitlimit auf eine volle Sekunde an (selbst wenn cURL dies unterstützen würde)". Selbst in der neuesten Version von WordPress (5.2.2) beträgt das Zeitlimit noch 1 Sekunde, sodass das Problem in allen Setups einschließlich der neuesten vorhanden ist.
Jake
Tatsächlich wurde das Timeout von 1 Sekunde in WordPress 4.6 durch # 33055 behoben . (Ein Blick auf die Codebasis ist verwirrend, da der alte Code immer noch vorhanden ist, einschließlich privateMethoden, wie sie WP_Http::_dispatch_requestjetzt nie aufgerufen werden.)
Jake