Как реализована блокировка WP Cron?


WordPress принимает меры для обеспечения того, чтобы задача cron не выполнялась дважды, когда она должна выполняться один раз, например, один раз в час, когда задано почасовое расписание, а не иногда дважды в запланированное время.

Хотя это не надежно, какие шаги предпринимает WordPress, чтобы убедиться, что это произойдет в запланированное время и только один раз, как указано?

Author: Tom J Nowell, 2012-12-03

2 answers

Устанавливается переходный процесс, отражающий состояние cron, который удаляется по завершении всех задач. Любые последующие запросы игнорируются, если этот переходный процесс обнаружен...

 6
Author: onetrickpony, 2012-12-03 17:06:03

Ответ Onetrickpony в основном правильный. Если вы позволите WordPress выполнять свои функции по умолчанию или вручную запустите wp-cron, выбрав его URL-адрес с уникальным значением "doing_wp_cron" в строке GET, то вы можете с уверенностью ожидать, что задания не будут выполняться дважды.

Но если вы выполните wp-cron.php из интерфейса командной строки PHP на вашей вкладке crontab история отличается. Теперь он проверит константу с именем WP_CRON_LOCK_TIMEOUT, чтобы выяснить, следует ли игнорировать блокировку, хранящуюся в преходящий. И есть условие гонки, которое позволяет иногда выполнять одно и то же задание дважды.

Если вы хотите быть действительно уверены, что одно и то же задание никогда не выполняется дважды, либо не устанавливайте параметр DISABLE_WP_CRON, либо используйте curl или wget на своей вкладке crontab для извлечения wp-cron.php вот так:

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

Также обратите внимание, что в 3.3 была ошибка , из-за которой задания выполнялись дважды, если два экземпляра wp-cron.php были запущены в ту же секунду. Теперь их нужно было бы запустить в ту же микросекунду, которая это все еще возможно, но крайне маловероятно.

 5
Author: Alexander Garden, 2013-11-10 10:59:25