Что такое cron и в чем его отличие от wp-cron?
Cron — команда UNIX, которая используется для выполнение периодических задач, через заданный промежуток времени.
Wp-cron — псевдо-крон, который необходим для выполнение функционала обычного крона, но в рамках wordpress. Он необходим для следующих задач:
- проверка обновлений ядра, плагинов, тем
- функционал сторонних плагинов, которые используют cron.
Особенности wp-cron
- Крон-задача это хук, который запускает через определенное время
- Работать с крон-задачи можно из wordpress
- Wp-cron запускается при запуске сайте т.е. при маленькой посещаемости сайта крон будет запаздывать, а при большой создавать лишнюю нагрузку
Все крон задачи хранятся в опции ‘cron‘. Каждая задача это массив состоящий из времени, хука, расписания и аргументов.
1562527413 => array( // key - время следующего выполнения в timestamp
"wp_version_check" => array( //hook name
"40cd750bba9870f18aada2478b24840a" => array( // key - md5( serialize( $event->args ) );
"schedule" => "twicedaily", // Название интервала
"args" => array(), // Аргументы
"interval" => 43200 // Интервал в timestamp
)
)
)
Посмотреть список всех задач можно с помощью:
var_dump( get_option( 'cron' ) );
Добавить свою крон задачу
Зарегистрировать задачу можно следующими функциями:
wp_schedule_single_event( $timestamp, $hook, $args = array() );
wp_schedule_event( $timestamp, $recurrence, $hook, $args = array() );
- $timestamp — время, в которое выполнится крон-задача;
- $recurrence — промежуток, через который выполнится задача:
hourly
— ежечасно;twicedaily
— дважды в день;daily
— ежедневно. - $hook — произвольное название крон-задачи, которая является обычным хуком
- $args = array() — массив параметров, который необходимо передать в хук.
Как видим отличие в том, что wp_schedule_single_event выполняется один раз, а wp_schedule_event через промежуток($recurrence).
Так же, чтобы не создавать дубли крон-задач, что является типичной ошибкой новичков, необходимо перед добавлением всегда проверять наличие этой задачи с помощью:
wp_next_scheduled( $hook, $args );
Данная функция вернет время, в которое выполнится крон-задача если она уже создана.
Готовый пример:
$args = array( 'first', 'second' );
if ( ! wp_next_scheduled( 'dmx_cron', $args ) ) { // проверяем наличие крон-задачи
wp_schedule_event( time(), 'hourly', 'dmx_cron', $args ); // создаем крон-задачу если такой нет
}
// Добавляем хук на нашу крон-задачу
add_action( 'dmx_cron', 'dmx_cron_callback', 10, 2 );
function dmx_cron_callback( $arg1, $arg2 ) {
//something do
}
Удалить крон-задачу можно следующими способами:
wp_clear_scheduled_hook( 'dmx_cron', array('first', 'second') );
wp_unschedule_event( wp_next_scheduled( 'dmx_cron' ), 'dmx_cron' );
wp_unschedule_hook( 'dmx_cron' );
Различие между функциями можно почитать в документации.
Мы так же можем добавить свой интервал если это необходимо:
add_filter( 'cron_schedules', 'dmx_interval');
function dmx_interval( $recurrence ) {
$recurrence['dmx_5_min'] = array(
'interval' => 600, // 60seconds * 5 min
'display' => 'Каждые 5 минут'
);
return $recurrence ;
}
Все функции:
- 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-cron
При каждой загрузке страницы подключается файл wp-cron.php в котором происходит работа запускается крон-задачи wordpress’а если это нужно.
Есть возможность отключить этот функционал и запускать их вручную или через серверный крон.
Чтобы отключить крон достаточно написать в wp-config.php
define('DISABLE_WP_CRON', true);
Для того, чтобы функционал wp-cron работал необходимо на хостинге настроить cron-задачу, которая будет запускать wp-cron. Делается это очень легко.
wget -O /dev/null -t 1 -q 'https://wp-punk.com/wp-cron.php?doing_wp_cron=1'