Що таке 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)
Author

Дмитро Кондрюк в веб-індустрії з 2003 року. В 2009р. заснував проект Український WordPress (що у подальшому став офіційним сайтом команди локалізації WordPress в Україні). З 2010 року засновник і технічний директор проекту Український хостинг для WordPress (WPHost.me) - повноцінного хостинг-сервісу, максимально оптимізованого на використання CMS WordPress.

Коментувати