Способы настройки WordPress cron с PHP и альтернативные варианты
Основные методы настройки WordPress cron
WordPress использует встроенный планировщик задач (wp-cron.php), который запускается при каждом посещении сайта. Это может создавать избыточную нагрузку и приводить к задержкам. Более эффективное решение - передать управление системному cron.
Как отключить встроенный cron и настроить системный планировщик?
Данный подход подходит для сайтов с высокой посещаемостью, где критична производительность, а также для точного контроля времени выполнения задач.
Шаг 1: Отключение встроенного cron
Добавьте в файл wp-config.php следующую строку перед комментарием /* That's all, stop editing! */:
define('DISABLE_WP_CRON', true);Bitrix cron events php (cron в 1с-битрикс для обработки событий)
Эта константа предотвращает автоматический запуск wp-cron.php при каждом запросе.
Шаг 2: Настройка системного cron
Откройте файл crontab текущего пользователя командой:
crontab -eWp cron php (настройка wordpress cron с php)
Добавьте запись, которая будет вызывать wp-cron.php каждые 5 минут (или другой интервал):
*/5 * * * * /usr/bin/php /var/www/html/wordpress/wp-cron.php >> /dev/null 2>&1Путь к PHP может отличаться - узнайте его через which php или whereis php. Путь к wp-cron.php укажите абсолютный.
Шаг 3: Проверка работы
Убедитесь, что cron запускается. Выполните команду:
crontab -lОна покажет текущие задачи. Дополнительно можно проверить логи cron (например, /var/log/syslog).
Типичная ошибка: PHP-скрипт не выполняется из-за разных настроек PHP CLI и PHP-FPM. Решение - указать полный путь к php и убедиться, что расширения (MySQL, curl) доступны в CLI. Также возможна проблема с правами доступа к wp-cron.php - проверьте владельца файла.
Как выполнять cron задачи через командную строку с помощью WP-CLI?
Этот вариант удобен для разработчиков, уже использующих WP-CLI, или для разовых запусков. Установите WP-CLI, затем выполните:
wp cron event run --allДля запуска только просроченных задач:
wp cron event run --due-nowМожно также посмотреть все запланированные события:
wp cron event listСоздать новую задачу через WP-CLI:
wp cron event schedule 'my_custom_hook' 'hourly' 'now'Проблема: команды WP-CLI могут требовать много памяти. Для больших сайтов используйте флаг --skip-plugins или --skip-themes для ускорения.
Как настроить планировщик с помощью плагина?
Подходит для пользователей без доступа к консоли. Популярные плагины: WP Crontrol, Advanced Cron Manager. Установите плагин, перейдите в раздел «Инструменты» -> «Cron-задачи» и управляйте событиями через интерфейс.
Риски: некоторые плагины могут конфликтовать с другими расширениями или создавать избыточные события при деактивации. Регулярно проверяйте список cron-задач.
Как создать собственную cron-задачу через код?
Необходимо для кастомной функциональности. Используйте функцию wp_schedule_event при активации плагина или темы:
register_activation_hook(__FILE__, 'my_activation_cron');
function my_activation_cron() {
if (!wp_next_scheduled('my_hourly_event')) {
wp_schedule_event(time(), 'hourly', 'my_hourly_event');
}
}
add_action('my_hourly_event', 'my_cron_function');
function my_cron_function() {
// ваш код
}Для разовых задач используйте wp_schedule_single_event.
Ошибка: дублирование событий при повторной активации плагина. Всегда проверяйте существование хука через wp_next_scheduled.
Как вручную инициировать выполнение cron через HTTP?
Подходит, если нет доступа к системному cron, но нужен внешний триггер. Вызовите URL https://your-site.com/wp-cron.php с помощью curl:
curl -s -o /dev/null https://your-site.com/wp-cron.phpМожно добавить проверку через ?doing_wp_cron=1, но это необязательно.
Проблема: при вызове через HTTP может быть таймаут из-за долгого выполнения задач. Увеличьте лимит времени в PHP ( set_time_limit(0) ) или используйте системный cron.
Как использовать внешний сервис мониторинга для вызова cron?
Сервисы вроде cron-job.org или EasyCron позволяют настроить регулярные HTTP-запросы к вашему wp-cron.php. Зарегистрируйтесь, укажите URL и интервал (например, каждые 5 минут). Это альтернатива системному cron.
Недостаток: зависит от доступности сервиса и может быть небезопасно, если передавать конфиденциальные параметры в URL. Используйте HTTPS.
// Пример создания кастомного интервала cron
add_filter('cron_schedules', 'my_custom_cron_interval');
function my_custom_cron_interval($schedules) {
$schedules['every_ten_minutes'] = array(
'interval' => 600, // 10 минут в секундах
'display' => 'Каждые 10 минут'
);
return $schedules;
}
// Регистрация cron-задачи с кастомным интервалом
if (!wp_next_scheduled('my_ten_minute_event')) {
wp_schedule_event(time(), 'every_ten_minutes', 'my_ten_minute_event');
}
add_action('my_ten_minute_event', 'do_my_ten_minute_task');
function do_my_ten_minute_task() {
// Логируем выполнение
$log = date('Y-m-d H:i:s') . ' - Task executed' . PHP_EOL;
file_put_contents(__DIR__ . '/cron_log.txt', $log, FILE_APPEND);
}Содержимое файла cron_log.txt после нескольких запусков: 2025-03-20 10:00:00 - Task executed 2025-03-20 10:10:00 - Task executed ...
// Пример предотвращения параллельного выполнения через файловую блокировку
function unique_cron_execution() {
$lock_file = __DIR__ . '/cron.lock';
$fp = fopen($lock_file, 'c');
if (flock($fp, LOCK_EX | LOCK_NB)) {
// выполняем задачу
sleep(30); // имитация долгой работы
flock($fp, LOCK_UN);
} else {
// другой процесс уже выполняется, пропускаем
error_log('Cron task skipped - another instance running.');
}
fclose($fp);
}
add_action('my_critical_event', 'unique_cron_execution');В syslog или error.log при параллельном запуске: [20-Mar-2025 10:05:00 UTC] Cron task skipped - another instance running.
// Пример использования WP-CLI для просмотра и ручного запуска событий
$ wp cron event list
+--------------------------+---------------------+---------------------+---------------------+
| hook | next_run | recurrence | schedule |
+--------------------------+---------------------+---------------------+---------------------+
| wp_version_check | 2025-03-21 02:00:00 | 43200 | 12 hours |
| wp_update_themes | 2025-03-21 02:00:00 | 43200 | 12 hours |
| my_custom_event | 2025-03-20 10:15:00 | 600 | 10 minutes |
+--------------------------+---------------------+---------------------+---------------------+
$ wp cron event schedule 'test_event' 'daily' 'tomorrow 3:00'
Событие 'test_event' запланировано на 2025-03-21 03:00:00.// Пример сложного сценария: выполнение только при определенном условии
function conditional_cron_runner() {
if (get_transient('cron_allowed') !== false) {
return; // блокировка по транзиенту
}
set_transient('cron_allowed', true, HOUR_IN_SECONDS); // блокируем на час
// выполнение задачи
}
add_action('my_hourly_event', 'conditional_cron_runner');Транзиент 'cron_allowed' устанавливается на 1 час, предотвращая повторное выполнение в течение этого периода.