Способы настройки WordPress cron с PHP и альтернативные варианты

Раздел: Управление WordPress -> Планировщик задач в CMS

Основные методы настройки 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 -e

Wp 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 час, предотвращая повторное выполнение в течение этого периода.

Настройка WordPress cron с PHP - comments

En
Wp cron php (php)