У меня есть около 20 wp_cron()
функций, таких как следующий код. Почти все кроны бегают ежечасно; несколько ежедневно.
if ( ! wp_next_scheduled( 'my_task_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'my_task_hook' );
}
add_action( 'my_task_hook', 'my_task_function' );
function my_task_function() {
//Complex Code
}
Чтобы повысить производительность сервера и не получать сообщений о ограничении количества серверов от хостинговых компаний, я хочу убедиться, что в один момент времени работает только один cron ... Возможно ли это?
Текущий принятый ответ отличный, но у меня есть следующий вопрос, поэтому я начинаю вознаграждение за этот вопрос.
Пожалуйста, сначала прочитайте принятый ответ.
Предположим, что Cron 1 работает, Мой код cron2 не будет работать, потому что мы все еще находимся в течение 5 минут, или первый cron все еще работает, но из-за wp_schedule_event( time(), 'hourly', 'my_task_hook' );
работы для cron2 я думаю, что WordPress считает, что cron2 работает ..... Так что в основном код кода cron2 никогда не запускается ..... Или я что-то неправильно понял?
Ответы:
Да, это возможно...
И, честно говоря, это часто очень важно сделать ... WP Scheduler иногда вызывает проблемы, когда задачи cron длинные ...
Так как же мне решить эту проблему?
Я использую Transients API для реализации семафоров ...
Вот код:
Почему я использую переходные процессы в этом случае? Потому что:
А что если есть много разных действий?
Допустим, есть много разных задач cron, которые никогда не должны запускаться в одно и то же время, но мы все же хотим, чтобы они все выполнялись ...
Если мы используем решение с семафором и используем только один семафор для всех этих задач, то некоторые из них могут никогда не запуститься. Так что же делать тогда?
В таком случае вы должны изменить свое мышление. У вас нет независимых задач, но есть очередь задач. Таким образом, вы должны реализовать это таким образом.
Так:
источник
delete_transient()
. Так что время имеет значение? Я имею в виду, какое время вы добавляетеset_transient
, оно удаляется сразу после того, как моя работа закончена ... Так почему же есть время?my_task_function_semaphore
в качестве имени для переходного процесса, я должен использовать все другие кроны с тем же именем?