Так, це можливо ...
І якщо чесно, це дуже важливо зробити ... Планувальник WP іноді, як правило, викликає проблеми, коли завдання Cron тривають ...
То як я вирішую цю проблему?
Я використовую API Transients для реалізації семафорів ...
Ось код:
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() {
// if some other my_task is already running, stop
if ( get_transient( 'my_task_function_semaphore' ) ) return;
// set semaphore for 5 minutes
set_transient( 'my_task_function_semaphore', true, 5*60 );
// DO YOUR STUFF
delete_transient( 'my_task_function_semaphore' );
}
Чому я використовую в цьому випадку перехідні періоди? Тому що:
- Вони є частиною WP.
- Вони прості у використанні та ефективні.
- Вони не спричинить тупиків. Скажімо, мій cron завдання може бути вбитий (може статися якась помилка, або вона працює занадто довго і вбивається тощо). У такому випадку він не видалить семафор, тому всі майбутні завдання не працюватимуть. Використання перехідних процесів вирішує цю проблему, оскільки через деякий час перехідний процес буде видалений.
А що робити, якщо зробити багато різних дій?
Тож скажімо, існує багато різних завдань на роботу, які ніколи не повинні виконуватись в один і той же час, але ми все одно хочемо, щоб вони виконувались ...
Якщо ми використовуємо рішення з семафором і використовуємо лише один семафор для всіх цих завдань, то деякі з них можуть ніколи не працювати. То що ж робити тоді?
У такому випадку слід змінити своє мислення. У вас немає незалежних завдань, але черга завдань, які потрібно виконати. Тож слід реалізувати це таким чином.
Тому:
- Ви додаєте якусь чергу (ви можете використовувати масив і зберігати її як опцію або додавати власну таблицю БД).
- Ви використовуєте поточну події WP cron щогодини для додавання завдань у чергу.
- Ви додаєте другі завдання cron WP, які виконуються набагато частіше, і вони "поїдають" завдання з черги по черзі. Це завдання "їдця" повинно використовувати семафор, щоб забезпечити виконання однієї задачі за мить.