web-dev-qa-db-de.com

Wie ist WP Cron Locking implementiert?

WordPress ergreift Maßnahmen, um sicherzustellen, dass eine Cron-Aufgabe nicht zweimal ausgeführt wird, wenn sie einmal ausgeführt werden soll, z. einmal pro Stunde, wenn ein Stundenplan angegeben wird, und nicht gelegentlich zweimal zur geplanten Zeit.

Welche Schritte unternimmt WordPress, um sicherzustellen, dass es zu den festgelegten Zeiten und nur einmal wie angegeben ausgeführt wird, obwohl es nicht narrensicher ist?

3
Tom J Nowell

Ein Übergang wird festgelegt, um den Status des Cron wiederzugeben, der gelöscht wird, wenn alle Aufgaben abgeschlossen sind. Alle nachfolgenden Anforderungen werden ignoriert, wenn dieser Übergang gefunden wird ...

4
onetrickpony

die Antwort von onetrickpony ist größtenteils richtig. Wenn Sie WordPress das Standardverfahren überlassen oder wp-cron manuell auslösen, indem Sie seine URL abrufen, wobei 'doing_wp_cron' auf einen eindeutigen Wert in der GET-Zeichenfolge festgelegt ist, können Sie sicher sein, dass Jobs nicht zweimal ausgeführt werden.

Wenn Sie jedoch wp-cron.php über die PHP CLI in Ihrer crontab ausführen, sieht die Geschichte anders aus. Jetzt wird eine Konstante mit dem Namen WP_CRON_LOCK_TIMEOUT überprüft, um herauszufinden, ob die im Transienten gespeicherte Sperre ignoriert werden soll. Und es gibt eine Rennbedingung, die es ermöglicht, dass ein Job manchmal zweimal ausgeführt wird.

Wenn Sie wirklich sicher sein möchten, dass derselbe Job niemals zweimal ausgeführt wird, setzen Sie entweder nicht DISABLE_WP_CRON oder verwenden Sie curl oder wget in Ihrer crontab, um wp-cron.php wie folgt abzurufen:

*/10 * * * * wget -q -O "http://www.example.com/wp-cron.php?doing_wp_cron=`date +\%s.\%N`" > /dev/null 2>&1

Beachten Sie auch, dass es einen Fehler in 3.3 gab, der dazu führte, dass Jobs zweimal ausgeführt wurden, wenn zwei Instanzen von wp-cron.php in derselben Sekunde gestartet wurden. Jetzt müssten sie in derselben Mikrosekunde gestartet werden, was immer noch möglich, aber höchst unwahrscheinlich ist.

2