Як переконатися, що одночасно працює лише один wp_cron ()?


9

У мене є близько 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 1 працює, мій код cron2 не працює, тому що ми все ще знаходимося протягом 5 хвилин або перший cron працює все ще, але через те, що wp_schedule_event( time(), 'hourly', 'my_task_hook' );працює для cron2, я думаю, що WordPress вважають, що cron2 працює ..... Отже, в основному код код cron2 ніколи не запускається ..... Або я щось неправильно зрозумів?


Ні, ви правильно це розумієте. Я
оновлю

Відповіді:


10

Так, це можливо ...

І якщо чесно, це дуже важливо зробити ... Планувальник 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 завдання може бути вбитий (може статися якась помилка, або вона працює занадто довго і вбивається тощо). У такому випадку він не видалить семафор, тому всі майбутні завдання не працюватимуть. Використання перехідних процесів вирішує цю проблему, оскільки через деякий час перехідний процес буде видалений.

А що робити, якщо зробити багато різних дій?

Тож скажімо, існує багато різних завдань на роботу, які ніколи не повинні виконуватись в один і той же час, але ми все одно хочемо, щоб вони виконувались ...

Якщо ми використовуємо рішення з семафором і використовуємо лише один семафор для всіх цих завдань, то деякі з них можуть ніколи не працювати. То що ж робити тоді?

У такому випадку слід змінити своє мислення. У вас немає незалежних завдань, але черга завдань, які потрібно виконати. Тож слід реалізувати це таким чином.

Тому:

  1. Ви додаєте якусь чергу (ви можете використовувати масив і зберігати її як опцію або додавати власну таблицю БД).
  2. Ви використовуєте поточну події WP cron щогодини для додавання завдань у чергу.
  3. Ви додаєте другі завдання cron WP, які виконуються набагато частіше, і вони "поїдають" завдання з черги по черзі. Це завдання "їдця" повинно використовувати семафор, щоб забезпечити виконання однієї задачі за мить.

Дякую, але мені дуже шкода, я ніколи раніше не використовував перехідне ... Але я намагаюся зрозуміти код. Чому ви встановили 5 хвилин для перехідного періоду, оскільки ви видаляєте перехідний за допомогою delete_transient(). Так що час має значення? Я маю на увазі, який час, коли ви ставите set_transient, він видаляється відразу після моєї роботи ... То чому ж є час?
Я найдуріша людина

Тому що можуть виникнути деякі помилки. Погляньте на останню точку кулі.
Krzysiek Dróżdż

Дякую, чудово ... Лише одне питання. Як я розумію, якщо я використовую my_task_function_semaphoreяк ім'я для перехідних, я повинен використовувати всі інші крони з тим же ім'ям?
Я найдуріша людина

@IamtheMostStupidPerson, це залежить від того, чого ти хочеш досягти ... Якщо лише одне завдання має спрацювати в даний момент, тоді так - усі завдання повинні використовувати ту саму перехідну назву, що і семафор
Krzysiek Dróżdż

1
Я робив подібні речі з інструментами черги роботи, як Gearman. Ця реалізація може допомогти: github.com/10up/WP-Minions
Fayaz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.