WP-Cron (wp-cron.php): отключение и настройка системного cron | оптимизация производительности WordPress

Уведомление о партнёрских ссылках v3.1
Уведомление о партнёрских ссылках v3.2 (мобильная версия)

В WordPress задачи Cron — это функция, которая автоматически выполняет задачи, запланированные на определённое время или дату. Они запускаются через файл wp-cron.php: WordPress вызывает этот файл при каждой загрузке страницы и обрабатывает запланированные задачи. Это просто, но на сайтах с большим трафиком может снижать производительность.

Ⅰ. Как выполняется WP-Cron и почему страдает производительность

Вместо традиционной системы Cron серверов Linux WordPress предлагает собственную функцию Cron — WP-Cron. WP-Cron работает через файл wp-cron.php: ⓐ при каждом посещении сайта он проверяет, есть ли запланированные задачи, и выполняет их, а ⓑ плагины вроде Rank Math и WP Rocket сами запускают свои периодические задачи по расписанию.

С другой стороны, на сайтах с большим трафиком wp-cron.php может вызываться слишком часто и перегружать сервер. Особенно когда одновременно заходит много пользователей, запускаются дублирующиеся задачи cron, а это может привести к росту загрузки CPU, задержкам ответа, замедлению загрузки страниц и другим проблемам.

Эти структурные ограничения WP-Cron могут снижать производительность WordPress, а на высоконагруженных сайтах, в интернет-магазинах и на новостных порталах — приводить к серьёзным узким местам.

🔄 Как работает WP-Cron и как он устроен

WP-Cron
WP-Cron(wp-cron.php)
ⓐ Проверка запланированных задач при посещении
ⓑ Периодические задачи плагинов(Rank Math, WP Rocket и др.)
Проблемы производительности WP-Cron
Зависимость от трафика
Перегрузка сервера из-за слишком частых вызовов
Дублирующиеся запуски и узкие места
Как запускается WP-Cron
Виртуальный планировщик, зависящий от трафика
Порядок выполнения запланированных задач
Запуск по посещениям, а не по времени

Ⅱ. Оптимизация производительности WordPress

  • ↳ Оптимизация через настройки WP-Cron

Способов оптимизировать производительность WordPress много. После оптимизации кеширования, фронтенда и базы данных можно добиться улучшений и с помощью настроек WP-Cron.

WordPress
Оптимизация производительности
Кеширование в браузере
Кеширование страниц
Оптимизация фронтенда
Подходящие плагины(Autoptimize, ShortPixel и др.)
Очистка базы данных
Удаление редакций, спама и временных таблиц
Плагины оптимизации БД(WP-Optimize и др.)
Настройка WP-Cron
WP-Cron(wp-cron.php)
ⓐ Проверка запланированных задач при посещении
ⓑ Периодические задачи плагинов(Rank Math, WP Rocket и др.)
Проблемы производительности WP-Cron
Зависимость от трафика
Перегрузка сервера из-за слишком частых вызовов
Дублирующиеся запуски и узкие места
Как запускается WP-Cron
Виртуальный планировщик, зависящий от трафика
Порядок выполнения запланированных задач
Запуск по посещениям, а не по времени

Запланированные события проверяются при каждой загрузке страницы WordPress, а из-за периодических задач плагинов неэффективный WP-Cron нужно использовать рациональнее.

1️⃣ Проверка WP-Cron

Если проверить задачи cron через WP-CLI, видно, что активные события Cron выполняются. Плагины вроде Rank Math и WP Rocket запускают запланированные задачи раз в день или каждые несколько минут.

WP CLI- просмотр списка запланированных событий cron командой wp-cron event list_

2️⃣ Как настроить WP-Cron

WP-Cron — это виртуальный планировщик, который обрабатывает запланированные задачи WordPress: wp-cron.php запускается при посещениях. Но запуск, зависящий от трафика, ненадёжен, а слишком частые вызовы могут нагружать сервер, поэтому его обычно дополняют системным cron.
При необходимости рекомендуется задать DISABLE_WP_CRON в wp-config.php, чтобы отключить WP-Cron, и запускать задачи по расписанию через cron Linux.

Параметр

Отключить WP-Cron + запускать только системным cron

Настройки

WP-Cron выключен, wp-cron.php запускается системным cron

Плюсы

Нет дублирующихся запусков, точный запуск по времени, низкая нагрузка на сервер

Минусы

Часть функций плагинов может перестать работать, а ошибка в настройке грозит пропуском задач

Рекомендация · Ситуация

Подходит для сайтов с большим трафиком и множеством запланированных задач

Однако у способа ① есть минус: отключается функция PreLoad в плагинах кеширования вроде WP Rocket, которая каждую минуту заранее создаёт кеш до того, как посетители откроют страницу.

⚙️ Правка файла wp-config.php

Настроить это можно, отключив WP_CRON.

# Отключение WP_CRON
define( 'DISABLE_WP_CRON', true );

Пока WP-Cron выполняется, WP_CRON_LOCK_TIMEOUT служит [блокировкой по времени], которая не даёт начаться другим запускам.

# 5 минут — 300, раз в 60 минут — 3600
define('WP_CRON_LOCK_TIMEOUT', 300);

Поэтому, вместо того чтобы только отключать WP-Cron в файле wp-config.php, рекомендуется после отключения добавить задачу System Cron — так же настроен и сервер, который сейчас обслуживается.

⚙️ Включение системного cron на сервере Linux [базовый вариант]

Включить можно для каждого домена отдельно.

# Запуск каждые 5 минут
*/5 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Запуск каждые 30 минут
*/30 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Запуск каждый час
0 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1
# Запуск раз в сутки
0 3 * * * curl -s https://example.com/wp-cron.php?doing_wp_cron > /dev/null 2>&1

Четыре строки выше — примеры для разных интервалов, которые добавляют в crontab: в заданное время curl обращается к адресу [wp-cron.php], и запланированные задачи выполняются даже без посетителей.

# Если сервер локальный
*/5 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1

# Запуск каждые 30 минут
*/30 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1

# Запуск каждый час
0 * * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1

# Запуск раз в сутки
0 3 * * * php /path/to/wordpress/wp-cron.php > /dev/null 2>&1

Если установлен WP-CLI, достаточно одной строки с нужным интервалом. ▼

# Запуск каждые 5 минут
*/5 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet

# Запуск каждые 30 минут
*/30 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet

# Запуск каждый час
0 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet

# Запуск раз в сутки
0 3 * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet

Эта настройка заставляет WP-CLI внутри сервера выполнять с опцией [--due-now] только задачи, срок которых наступил, а [flock -n] пропускает новый запуск, если предыдущий ещё не завершился.

⚙️ WP-CLI и системный cron раз в минуту, защита от дублирования задач cron

Штатный WP_CRON при большом объёме работы просто пропускает задачи и выполняет их позже. Отключите штатный WP-Cron и задайте для запланированных задач блокировку на 5 минут — тогда системный cron и WP-Cron не будут запускаться одновременно.

define('DISABLE_WP_CRON', true);         // Отключить автозапуск WP-Cron
define('WP_CRON_LOCK_TIMEOUT', 300);     // Без ожидания → пропуск; блокировка на 5 минут во время запланированной задачи

/* That's all, stop editing! Happy publishing. */

Дополнительно задайте системному cron опцию flock -n, чтобы на его стороне запуск сразу завершался.

# Настройка wp cron: flock -n → без ожидания → сразу выход
*/1 * * * * cd /sites/example.com/files/ && flock -n ~/.wp_cron.lock /usr/local/bin/wp cron event run --due-now --quiet

Итог такой комбинации настроек:

  • Внутренний автозапуск WP выключен → запланированные задачи выполняются независимо от числа посетителей
  • Системный cron пытается запуститься каждую минуту → если есть запланированные задачи, они выполняются
  • Пока стоит блокировка, повторного запуска 5 минут нет → защита от дублирования (на деле при настройке flock -n WP_CRON_LOCK_TIMEOUT особо не нужен.)

С защитой от дублирования на практике всё идёт так:

  1. 08:00 → системный cron вызывает wp-cron.php
    • Запланированная задача A выполняется → ставится блокировка на 5 минут
  2. 08:01 → системный cron вызывает снова
    • Задача A заблокирована → не выполняется
  3. 08:02–08:04 → то же самое
    • 08:05 → блокировка снята → если есть следующая запланированная задача, она выполняется

WordPress больше не запускает задачи сам — за их выполнение отвечает система. А WP_CRON_LOCK_TIMEOUT работает как дополнительная страховка от дублирующихся запусков.

Параметр

WP_CRON_LOCK_TIMEOUT

flock -n

Тип блокировки

Внутри WordPress

Уровень системы

Где хранится блокировка

В БД: doing_cron в wp_options

В файле системы: ~/.wp_cron.lock

Ожидание

❌ Без ожидания → пропуск

❌ Без ожидания → сразу выход

Защита от дублирования

✅ Защищает от дублирования

✅ Защищает от дублирования

После этого можно проверить всё командой WP-CLI и убедиться, что cron работает как прежде.

wp cron event list
+-------------------------------------------+---------------------+-----------------------+---------------+
| hook                                      | next_run_gmt        | next_run_relative     | recurrence    |
+-------------------------------------------+---------------------+-----------------------+---------------+
| rocket_saas_pending_jobs                  | 2026-10-17 12:00:57 | now                   | 1 minute      |
| action_scheduler_run_queue                | 2026-10-17 12:00:57 | now                   | 1 minute      |
| action_scheduler_run_queue_rucss          | 2026-10-17 12:00:58 | now                   | 1 minute      |
| rocket_saas_on_submit_jobs                | 2026-10-17 12:00:58 | now                   | 1 minute      |
| rocket_preload_process_pending            | 2026-10-17 12:00:59 | now                   | 1 minute      |
| rocket_purge_time_event                   | 2026-10-17 12:16:59 | 15 minutes 8 seconds  | 1 hour        |
| wp_privacy_delete_old_export_files        | 2026-10-17 12:28:46 | 26 minutes 55 seconds | 1 hour        |
| wp_update_user_counts                     | 2026-10-17 20:15:52 | 8 hours 14 minutes    | 12 hours      |
| rocket_preload_revert_old_failed_rows     | 2026-10-17 20:17:59 | 8 hours 16 minutes    | 12 hours      |
| wp_version_check                          | 2026-10-17 20:28:34 | 8 hours 26 minutes    | 12 hours      |
| wp_update_plugins                         | 2026-10-17 20:58:34 | 8 hours 56 minutes    | 12 hours      |
| wp_update_themes                          | 2026-10-17 21:28:34 | 9 hours 26 minutes    | 12 hours      |
| recovery_mode_clean_expired_keys          | 2026-10-18 07:28:46 | 19 hours 26 minutes   | 1 day         |
| wp_privacy_personal_data_cleanup_requests | 2026-10-18 07:28:46 | 19 hours 26 minutes   | 1 day         |
| wp_scheduled_delete                       | 2026-10-18 08:15:52 | 20 hours 14 minutes   | 1 day         |
| delete_expired_transients                 | 2026-10-18 08:15:52 | 20 hours 14 minutes   | 1 day         |
| wp_scheduled_auto_draft_delete            | 2026-10-18 08:15:54 | 20 hours 14 minutes   | 1 day         |
| wp_delete_temp_updater_backups            | 2026-10-18 08:16:17 | 20 hours 14 minutes   | 1 week        |
| rocket_update_dynamic_lists               | 2026-10-18 08:16:57 | 20 hours 15 minutes   | 1 week        |
| rocket_saas_clean_rows_time_event         | 2026-10-18 08:16:57 | 20 hours 15 minutes   | 1 week        |
| rocket_performance_hints_cleanup          | 2026-10-18 08:16:58 | 20 hours 15 minutes   | 1 day         |
| rocket_preload_clean_rows_time_event      | 2026-10-18 08:26:57 | 20 hours 25 minutes   | 1 week        |
| rocket_database_optimization_time_event   | 2026-10-18 09:34:25 | 21 hours 32 minutes   | 1 day         |
| wp_site_health_scheduled_check            | 2026-10-19 07:28:46 | 1 day 19 hours        | 1 week        |
| rocket_remove_saas_failed_jobs            | 2026-10-19 08:16:58 | 1 day 20 hours        | 3 days        |
+-------------------------------------------+---------------------+-----------------------+---------------+

В выводе видны имена зарегистрированных хуков, время следующего запуска и интервал повторения, а задачи, у которых в столбце [next_run_relative] стоит [now], обрабатываются сразу при следующем запуске cron.

Ⅲ. Когда запланированные задачи WP-Cron не выполняются

Легко решить, что задача запустится сама, как только наступит её время, но WP-Cron проверяет, что нужно сделать, не по часам, а когда приходит запрос страницы. Задача, назначенная на 14:00, при отсутствии запросов до 17:00 выполнится только при первом запросе в 17:00.

Если запуск задерживается, запланированные записи в списке записей помечаются как [Публикация просрочена] (Missed schedule). В разделе [рекомендуемые улучшения] на вкладке «Состояние» в [Инструменты › Здоровье сайта] появляется [Запланированное задание пропущено]. Задачи, которые зарегистрировали плагины, например предзагрузка кеша, по той же причине ждут запуска.

Запланированная задача проходит через запрос страницы, проверку списка задач и петлевой запрос и выполняется в [wp-cron.php]; если оборвётся любое из этих звеньев, она не запустится даже после наступления времени.

🧭 Путь запланированной задачи до запуска
Поясняющая схема
🔍 Ситуация
🌐
Запрос страницы
Посещение, при котором запускается WordPress
✕ Не запускается
→
🔎
Проверка задач
Есть ли задачи, чьё время прошло
✕ Не проверяет
→
🔁
Петлевой запрос
Сервер → [wp-cron.php] на своём же адресе
✕ 403
→
⚙️
Выполнение задачи
[wp-cron.php] обрабатывает запланированные задачи
✓ Выполняется
Когда приходит запрос, который запускает WordPress, проверяются задачи с прошедшим временем, а сервер вызывает [wp-cron.php] на своём же адресе и обрабатывает их.
Если посещений нет или ответ отдаёт файл кеша страниц, WordPress не запускается, и даже просроченные задачи ждут следующего запроса.
Если [DISABLE_WP_CRON] равен true, задачи не проверяются даже при запросах, а без системного cron их некому выполнять.
Если [wp-cron.php] блокирует правило безопасности, петлевой запрос возвращается с кодом 403, и задачи не выполняются.

1️⃣ Когда нет посещений или отвечает кеш страниц

WP-Cron проверяет задачи только при запросах, которые запускают WordPress, поэтому в часы без посещений просроченные задачи просто копятся. Даже при посещениях результат тот же, если отвечает файл кеша страниц: WordPress не запускается.

На WordPress с включённым кешем страниц WP Rocket открытие закешированной главной не оставило в журнале ни одного вызова [wp-cron.php]. Когда открыли незакешированный адрес, вызов записался в ту же секунду, и пять отложенных задач выполнились.

Отложенные задачи можно увидеть, отфильтровав список WP-CLI по строкам, где [next_run_relative] равен [now].

wp cron event list --next_run_relative=now --fields=hook,next_run_gmt,next_run_relative
+----------------------------------+---------------------+-------------------+
| hook                             | next_run_gmt        | next_run_relative |
+----------------------------------+---------------------+-------------------+
| rocket_saas_pending_jobs         | 2026-10-17 14:49:57 | now               |
| action_scheduler_run_queue       | 2026-10-17 14:49:57 | now               |
| action_scheduler_run_queue_rucss | 2026-10-17 14:49:58 | now               |
| rocket_saas_on_submit_jobs       | 2026-10-17 14:49:58 | now               |
| rocket_preload_process_pending   | 2026-10-17 14:49:59 | now               |
+----------------------------------+---------------------+-------------------+

[now] означает, что запланированное время уже прошло. Эта команда списка тоже загружает WordPress, поэтому при наличии отложенных задач в момент завершения она вызывает [wp-cron.php]. Если сразу запустить ту же команду ещё раз, только что видимых задач в списке уже не будет.

Чтобы разобрать отложенные задачи до того, как устранить причину, сразу выполните через WP-CLI только просроченные.

wp cron event run --due-now
Executed the cron event 'rocket_saas_pending_jobs' in 0.005s.
Executed the cron event 'action_scheduler_run_queue' in 0.006s.
Executed the cron event 'action_scheduler_run_queue_rucss' in 0.006s.
Executed the cron event 'rocket_saas_on_submit_jobs' in 0.005s.
Executed the cron event 'rocket_preload_process_pending' in 0.007s.
Success: Executed a total of 5 cron events.

Эта команда выполняет задачи внутри сервера без HTTP-запроса; чтобы обрабатывать их через равные промежутки независимо от посещений, добавьте ту же команду в системный cron.

2️⃣ Когда включён только DISABLE_WP_CRON, а системного cron нет

Если задать [DISABLE_WP_CRON] значение true, WP-Cron не проверяет задачи даже при запросах страниц. Официальная документация тоже советует сначала добавить задачу в системный планировщик и только потом вставлять эту константу: если вставить одну константу без регистрации, запланированные задачи выполнять будет некому.

С этой константой запись, запланированная чуть больше чем через минуту, и после наступления времени осталась в статусе [Запланировано], а в столбце даты списка записей появилось [Публикация просрочена]. За всё это время не записалось ни одного вызова [wp-cron.php].

Включена ли константа, можно проверить командой [wp cron test].

wp cron test
Error: The DISABLE_WP_CRON constant is set to true. WP-Cron spawning is disabled.

Если появляется эта ошибка, проверьте, есть ли в системном cron строка, которая вызывает [wp-cron.php] или запускает [wp cron event run]. Если crontab аккаунта сайта пуст, вывод будет таким.

crontab -l
no crontab for example

Если такой строки нет, добавьте системный cron, а если окружение этого не позволяет, удалите строку [DISABLE_WP_CRON] и снова пользуйтесь WP-Cron.

3️⃣ Когда заблокирован петлевой запрос сервера

Когда есть работа, WP-Cron заставляет сервер отправить запрос к [wp-cron.php] на адресе собственного сайта и так выполняет задачи — это и есть петлевой запрос. Если [wp-cron.php] блокирует правило безопасности, петлевой запрос возвращается с кодом 403, и задачи не выполняются.

На сервере с конфигурацией Nginx и Apache, когда доступ к [wp-cron.php] ограничили только адресом 127.0.0.1, петлевой запрос заблокировался с кодом 403. Дело в том, что запрос, который сервер отправляет на свой домен, приходит через публичный IP, и [wp cron test] возвращает тот же код состояния.

wp cron test
Error: WP-Cron spawn returned HTTP status code: 403 Forbidden

Когда задачи задерживались больше 5 минут, на экране [Здоровье сайта] в разделе [рекомендуемые улучшения] появились сразу предупреждение о петлевом запросе и сбой запланированного задания.

Вкладка «Состояние» в разделе «Здоровье сайта»: сбой запланированного задания и предупреждение о петлевом запросе после блокировки петлевого запроса WP-Cron с кодом 403

После удаления правила [wp cron test] снова прошёл успешно. Если правило нужно сохранить, запускайте задачи через WP-CLI из системного cron. Запуск WP-CLI не проходит через HTTP-запрос, поэтому отложенные задачи обработались даже при том же правиле.

🔢 FAQ & рекомендуемые материалы

Проверки обновлений [wp_version_check], [wp_update_plugins] и [wp_update_themes] на тестовом сайте шли каждые 12 часов. Очистка корзины ([wp_scheduled_delete]) и удаление просроченных транзиентов были зарегистрированы ежедневно, а проверка здоровья сайта — еженедельно. Очистка корзины навсегда удаляет записи и комментарии, пролежавшие в корзине больше 30 дней (по умолчанию), и если WP-Cron не запускается, эти задачи тоже не выполняются вовремя.

Это хук, которым Action Scheduler — библиотека очереди задач, встроенная в плагины, — обрабатывает ожидающие задачи; на тестовом сайте он был зарегистрирован с интервалом в 1 минуту. Официальный FAQ Action Scheduler поясняет, что по умолчанию очередь запускается из WP-Cron и в конце запросов к админке (хук [shutdown]). На тестовом сайте, где был включён только [DISABLE_WP_CRON] без системного cron, эта строка тоже осталась в состоянии [now] вместе с запланированной записью.

По официальной документации есть альтернативный способ: задать в [wp-config.php] константе [ALTERNATE_WP_CRON] значение true. Если есть задачи к выполнению, GET-запрос посетителя перенаправляется на тот же адрес с добавленным значением [doing_wp_cron]. Тогда [wp-cron.php] выполняется внутри исходного запроса, без петлевого запроса. Та же документация предупреждает, что это не штатное поведение WordPress и оно связано с рисками, поэтому, если системный cron зарегистрировать можно, в первую очередь используйте его.

🧭 Рекомендуемые материалы о запланированных задачах WordPress 7 статей · 4 источника
🗂️ Запланированные задачи WordPress
📄 WP-Cron(wp-cron.php) 📄 Базовые настройки wp-config.php 📄 Здоровье сайта WordPress
📋 Настройка crontab 📄 Команда nice в Linux
📋 WP CLI: установка и настройка 📄 Поиск синхронизированных паттернов: WP-CLI
📡 About Cron 📡 События WP Cron 📡 Как устроено расписание cron 📡 Подключение WP-Cron к системному планировщику задач
Ничего не найдено.
Cron — плитка-ссылка на Plugin Handbook WordPress (внешняя ссылка)
Внешняя ссылка · Официальная документация WordPress
Cron
Раздел Cron в Plugin Handbook WordPress: как WP-Cron при каждом запросе страницы проверяет список запланированных задач.
Читать →Текущая статья
Scheduling WP Cron Events — плитка-ссылка на Plugin Handbook WordPress (внешняя ссылка)
Внешняя ссылка · Официальная документация WordPress
Scheduling WP Cron Events
Как добавить хук для запланированной задачи и зарегистрировать его через [wp_schedule_event], а также как снять расписание при деактивации плагина.
Читать →Текущая статья
Understanding WP-Cron Scheduling — плитка-ссылка на Plugin Handbook WordPress (внешняя ссылка)
Внешняя ссылка · Официальная документация WordPress
Understanding WP-Cron Scheduling
Как WP-Cron повторяет задачи не в фиксированное время, а от первого запуска с интервалом в секундах, и какие у него четыре интервала по умолчанию.
Читать →Текущая статья
Hooking WP-Cron Into the System Task Scheduler — плитка-ссылка на Plugin Handbook WordPress (внешняя ссылка)
Внешняя ссылка · Официальная документация WordPress
Hooking WP-Cron Into the System Task Scheduler
Порядок действий: добавить вызов [wp-cron.php] в Планировщик заданий Windows и cron Linux, а затем отключить WP-Cron через [DISABLE_WP_CRON].
Читать →Текущая статья

ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Докажите, что вы человек: 6   +   1   =