Що таке cron і в чому його відмінність від wp-cron?
Cron – така команда в UNIX-системах, яка використовується для виконання періодичних завдань, через заданий проміжок часу. Простими словами – це планувальник, через який можна вказати, з якою періодичністю запускати “щось”.
Wp-cron – це в певному сенсі аналог звичайного крону, обгортка, яка необхідна для виконання функціоналу звичайного крона, але в рамках wordpress.
Дя чого використовується:
- перевірка оновлень ядра, плагінів, шаблонів
- для певного функціоналу сторонніх плагінів, які використовують cron.
Особливості wp-cron
Крон-завдання це така функція, яка запускає якусь іншу, задану вами, задачу/функцію через певний час (з певною періодичністю). Працювати з крон-задачами можна прямо з wordpress.
Wp-cron запускається кожен раз під час відкриття сторінок сайту чи адмінки і в момент запуску намагається виконати усі задачі, яким час виконуватись.
Тобто при маленькій відвідуваності сайту крон може “запізнюватися”, оскільки сторінки можуть відкриватись рідко і крон буде запускатися рідко, а при великій – створювати зайве навантаження.
Усі крон завдання зберігаються в опції з іменем ‘ cron ‘. Кожне завдання це масив, що складається з часу, хука, розкладу і аргументів.
1562527413 => array( // key - час наступного виконання в форматі timestamp
"wp_version_check" => array( //назва хука, функції, що має спрацювати
"40cd750bba9870f18aada2478b24840a" => array( // key - md5( serialize( $event->args ) );
"schedule" => "twicedaily", // Назва часового інтервалу
"args" => array(), // Аргументи
"interval" => 43200 // Інтервал в форматі timestamp
)
)
)
Code language: PHP (php)
Подивитися список всіх завдань можна за допомогою такого коду:
var_dump( get_option( 'cron' ) );
Code language: JavaScript (javascript)
Як додати свою функцію чи задачу в крон
Зареєструвати завдання можна наступним чином:
wp_schedule_single_event( $timestamp, $hook, $args = array() );
wp_schedule_event( $timestamp, $recurrence, $hook, $args = array() );
Code language: PHP (php)
$timestamp – це час, в який має виконатися крон-завдання;
$recurrence – це проміжок, через який виконається завдання:
– hourly – щогодини;
– twicedaily – двічі на день;
– daily – щодня.
$hook- довільна назва крон-задачі, яка є звичайним хуком
$args = array () – масив параметрів, який необхідно передати в хук.
Відмінність між двома функціями у тому, що wp_schedule_single_event виконується один раз, а wp_schedule_event через проміжок ($recurrence).
Щоб не створювати дублі крон-завдань, необхідно перед додаванням завжди перевіряти наявність цього завдання за допомогою:
wp_next_scheduled( $hook, $args );
Code language: PHP (php)
Ця функція поверне час, в який виконається крон-завдання, якщо воно вже створене.
Готовий приклад
$args = array( 'first', 'second' );
if ( ! wp_next_scheduled( 'wpcoua_cron', $args ) ) { // перевіряємо наявність крон-завдання
wp_schedule_event( time(), 'hourly', 'wpcoua_cron', $args ); // додаємо крон-завдання, якщо такого немає
}
// Додаємо хук, що викличе вашу функцію під час виконання крон-завдання
add_action( 'wpcoua_cron', 'wpcoua_cron_callback', 10, 2 );
function wpcoua_cron_callback( $arg1, $arg2 ) {
//something do
}
Code language: PHP (php)
Видалити крон-завдання можна за допомогою такого коду:
wp_clear_scheduled_hook( 'wpcoua_cron', array('first', 'second') );
wp_unschedule_event( wp_next_scheduled( 'wpcoua_cron' ), 'wpcoua_cron' );
wp_unschedule_hook( 'wpcoua_cron' );
Code language: PHP (php)
Ми так само можемо додати свій інтервал, якщо це необхідно:
add_filter( 'cron_schedules', 'wpcoua_interval');
function wpcoua_interval( $recurrence ) {
$recurrence['wpcoua_5_min'] = array(
'interval' => 300, // 60сек * 5 min
'display' => 'Кожні 5 хвилин'
);
return $recurrence ;
}
Code language: PHP (php)
Всі функції:
- wp_schedule_single_event — створити крон-задачу, що виконується тільки 1 раз;
- wp_schedule_event — створити крон-задачу, що виконується через певний інтервал;
- wp_reschedule_event — перестворити крон-задачу, змінивши інтервал;
- wp_unschedule_event — видалити крон-задачу;
- wp_clear_scheduled_hook — видалити усі крон-задачі, що викликають певний хук і мають певні параметри;
- wp_unschedule_hook — видалити усі задачі за назвою;
- wp_next_scheduled — перевірити, чи існує задача та отримати час наступного виконання;
- spawn_cron — надіслати запит на виконання wp-cron через HTTP-запит;
- wp_cron — запустити крон-задачу;
- wp_get_schedules — отримати усі зареєстровані інтервали;
- wp_get_schedule — отримати интервал вказаної крон-задачі;
- wp_get_ready_cron_jobs — отримати усі задачі, що потрібно виконати зараз.
Зменшення навантаження на сервер
Є можливість відключити вбудований функціонал крону у Вордпрес і запускати заплановані задачі вручну або через серверний крон. Це дозволить зменшити кількість викликів вордпресівського крону, якщо ваш сайт достатньо відвідуваний.
Щоб вимкнути крон досить написати в wp-config.php
define('DISABLE_WP_CRON', true);
Code language: JavaScript (javascript)
Після вимкнення, для того, щоб функціонал wp-cron працював, необхідно на хостингу налаштувати cron-завдання, яке буде запускати wp-cron. Робиться це дуже легко – за потреби вам допоможе техпідтримка. Просто додайте запуск цієї команди раз у 5 хвилин в крон у хостинг-панелі, змінивши тестовий домен на свій:
wget -O /dev/null -t 1 -q 'https://wp-punk.com/wp-cron.php?doing_wp_cron=1'
Code language: JavaScript (javascript)