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

В 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 и как он устроен
Ⅱ. Оптимизация производительности WordPress
Способов оптимизировать производительность WordPress много. После оптимизации кеширования, фронтенда и базы данных можно добиться улучшений и с помощью настроек WP-Cron.
Запланированные события проверяются при каждой загрузке страницы WordPress, а из-за периодических задач плагинов неэффективный WP-Cron нужно использовать рациональнее.
1️⃣ Проверка WP-Cron
Если проверить задачи cron через WP-CLI, видно, что активные события Cron выполняются. Плагины вроде Rank Math и WP Rocket запускают запланированные задачи раз в день или каждые несколько минут.

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 особо не нужен.)
С защитой от дублирования на практике всё идёт так:
- 08:00 → системный cron вызывает wp-cron.php
- Запланированная задача A выполняется → ставится блокировка на 5 минут
- 08:01 → системный cron вызывает снова
- Задача A заблокирована → не выполняется
- 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]; если оборвётся любое из этих звеньев, она не запустится даже после наступления времени.
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-nowExecuted 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 testError: The DISABLE_WP_CRON constant is set to true. WP-Cron spawning is disabled.Если появляется эта ошибка, проверьте, есть ли в системном cron строка, которая вызывает [wp-cron.php] или запускает [wp cron event run]. Если crontab аккаунта сайта пуст, вывод будет таким.
crontab -lno 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 testError: WP-Cron spawn returned HTTP status code: 403 ForbiddenКогда задачи задерживались больше 5 минут, на экране [Здоровье сайта] в разделе [рекомендуемые улучшения] появились сразу предупреждение о петлевом запросе и сбой запланированного задания.

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






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