Стоит ли отключить WP_CRON и запускать wp-cron.php с сервера?

20 янв. 2017 г., 16:36:57
Просмотры: 27.2K
Голосов: 17

Похоже, что WordPress без необходимости запускает WP CRON при каждой загрузке страницы. Я думаю, вместо того чтобы запускать его при каждом посещении, почему бы не настроить его запуск каждые 5 минут через сервер? Я мог бы просто вызывать wp-cron.php каждые пять минут и достичь желаемого результата?

Есть ли какие-либо недостатки у такого подхода?

1
Комментарии

Похожие вопросы: https://wordpress.stackexchange.com/questions/167238/running-wp-cron-on-multisite-the-right-way

Jesse Nickles Jesse Nickles
28 мар. 2024 г. 12:14:26
Все ответы на вопрос 4
6
19

Нет никаких недостатков в использовании серверных cron-заданий для запуска WP CRON. Напротив, это рекомендуемая практика.

Согласно официальной документации по разработке плагинов WordPress:

WP-Cron не работает непрерывно, что может стать проблемой, если есть критические задачи, которые должны выполняться вовремя. Решение простое: настройте планировщик задач вашей системы на выполнение с нужными интервалами (или в конкретное необходимое время).

Для этого сначала отключите стандартное поведение cron в файле wp-config.php:

define('DISABLE_WP_CRON', true);

Затем запланируйте запуск wp-cron.php на вашем сервере. В Linux это делается так:

crontab -e

Однако вместо запуска через командную строку (CLI) выполните его как HTTP-запрос. Для этого можно использовать wget:

*/5 * * * * wget -q -O - https://ваш-домен.com/wp-cron.php?doing_wp_cron

WordPress загружает все необходимые основные файлы, плагины и т.д. в wp-cron.php с помощью следующего кода:

if ( !defined('ABSPATH') ) {
    /** Настройка окружения WordPress */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

Так что не беспокойтесь о том, что WordPress не загрузит важные функции.

20 янв. 2017 г. 18:36:34
Комментарии

В документации WordPress.org, на которую вы ссылаетесь, упоминается wget http://ВАШ_САЙТ_URL/wp-cron.php без добавления ?doing_wp_cron. Так какой вариант лучше? Что делает добавление ?doing_wp_cron, чего нет в версии без этого параметра?

Garconis Garconis
26 апр. 2018 г. 23:25:51

Вероятно, просто для того, чтобы в ваших логах отображалась строка запроса, и вы точно знали, как был вызван скрипт.

Slbox Slbox
13 апр. 2019 г. 00:45:06

Я совершенно не согласен с этим. Во-первых, это не соответствует действительности, что этот метод "рекомендуется". Во-вторых, этот метод нарушит работу любых плагинов, которые используют фактически рекомендуемый метод планирования событий. Я считаю, что это очень плохой совет. Почти никто не должен отключать крон, если у вас нет ОЧЕНЬ специфической причины для этого. Единственная причина, которую я могу придумать - это если вы разбиваете WordPress для CDN или что-то подобное. Это НЕ обычная практика.

John Dee John Dee
27 сент. 2019 г. 23:03:17

@JohnDee: этот метод не отключает cron полностью, он отключает только метод WP Cron, который проверяет и пытается запускать задачи при каждой загрузке страницы. define('DISABLE_WP_CRON', true); отключает только эту часть процесса cron, а затем вызов cron-скрипта с помощью кода типа */5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron на сервере гарантирует выполнение cron-задач. Любой плагин планирования даже не заметит разницы.

Fayaz Fayaz
28 сент. 2019 г. 06:01:49

Ссылка на документацию WordPress.org по этой теме изменилась на https://developer.wordpress.org/plugins/cron/hooking-wp-cron-into-the-system-task-scheduler/

aldemarcalazans aldemarcalazans
11 дек. 2019 г. 22:12:59

@aldemarcalazans: спасибо! Ссылка обновлена. WP действительно следовало сделать редирект. Видимо, они не заботятся о SEO :)

Fayaz Fayaz
12 дек. 2019 г. 04:42:43
Показать остальные 1 комментариев
2

Есть несколько недостатков: Во-первых, при использовании wp-cron.php через CLI переменные, такие как $_SERVER, не устанавливаются. Эту проблему можно обойти, отправляя curl-запрос к wp-cron.php вместо прямого вызова.

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

Однако я предпочитаю использовать wp-cli после правильной настройки почты в Postfix и конфигурации php-fpm (для nginx), а также установки задачи в crontab, например:

*/5    *   *   *   *  wp cron event list --skip-plugins --skip-themes --path="/var/www/vhosts/example.com/httpdocs/wp" --fields=hook,next_run_relative --format=csv | awk -F, '$2=="now" {print $1}' | xargs -r wp --path="/var/www/vhosts/example.com/httpdocs/wp" cron event run $1

(Список всех крон-задач в CSV-формате с указанными полями — hook (название задачи) и next_run_relative (время следующего запуска). С помощью AWK выбираем задачи, у которых next_run_relative равен 'now' (те, которые должны выполниться сейчас), и передаём этот список в xargs для выполнения команды wp cron event run $HOOK для каждой задачи.)

Использование wp-cli обеспечивает корректную загрузку WordPress (я пропускаю загрузку плагинов при выводе списка задач, так как ошибки и предупреждения PHP могут нарушить формат вывода, но не пропускаю их при выполнении задач через xargs, потому что крон может зависеть от этих плагинов).

Надеюсь, это поможет вам разобраться в возможных подводных камнях.

20 янв. 2017 г. 18:16:45
Комментарии

Как насчет настройки: /15 * * * wget -q -O - http://yourdomain.com/wp-cron.php?doing_wp_cron, как предложил TomMcFarlin - https://tommcfarlin.com/wordpress-cron-jobs/. Кажется, работает хорошо. Был бы признателен за ваш комментарий.

TheBigK TheBigK
20 янв. 2017 г. 19:19:38

Да, как я уже упоминал, люди выбирают использование curl (wget или любого другого http-вызова) для запуска крон-заданий, и в этом методе нет ничего плохого. Я просто предупреждал о проблемах прямого вызова wp-cron php файла, который не включает необходимые файлы, и предлагал альтернативный метод, если хотите немного разнообразия.

TechnicalChaos TechnicalChaos
20 янв. 2017 г. 20:09:16
0

Я до сих пор не нашел реальных недостатков в переносе wp-cron на внешний сервис. Занимаюсь этим уже много лет.

Особенно в современном мире, где приложения можно запускать как микросервисы.

Я использую отдельные Docker-контейнеры для каждого компонента WordPress - php, веб-сервер, база данных, crontab, redis и так далее). Crontab работает как отдельный контейнер, вызывая wp-cron через HTTP в локальной сети и запускаясь только тогда, когда это необходимо.

Это снижает нагрузку на бэкенд-узлы и повышает безопасность за счет уменьшения поверхности атаки.

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

6 февр. 2020 г. 15:23:58
5
-3

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

Многие плагины используют WP-Cron для планирования задач. Они могут начать работать некорректно, если вы отключите планировщик.

В интернете распространено множество руководств на эту тему, потому что она действительно запутанная, а также потому что отключение wp-cron не оказывает немедленного заметного эффекта на сайт. Однако через полгода это может вызвать головную боль у разработчика, которому придётся разбираться с загадочными проблемами.

Кроме того, WP Heartbeat срабатывает каждые 15 секунд в административной части сайта, решая эту проблему для 99% пользователей, которые думают, что она у них есть.

29 сент. 2019 г. 15:33:08
Комментарии

Это ужасный ответ - они -НЕ- отключают WP Cron. Они просто отключают вызов WP Cron при загрузке страницы и переносят его на системный демон cron. Боже.

Barry Chapman Barry Chapman
26 янв. 2020 г. 08:03:48

В любом случае, главная причина оставить всё как есть - многие плагины теперь используют cron для выполнения фоновых задач. Вы можете нарушить работу чего-то, что делает СЛЕДУЮЩИЙ человек, потому что он ожидает, что система будет работать стандартным образом. Удачи!

John Dee John Dee
26 янв. 2020 г. 12:32:24

Если плагин написан так, что полностью ломается при отключении wp cron, значит, он был запрограммирован некомпетентным разработчиком, и его лучше сразу удалить.

Magnetic_dud Magnetic_dud
3 апр. 2020 г. 23:46:37

Что ж, эти два комментария подтверждают мою точку зрения. Один разработчик говорит: "это не отключает cron, а лишь переносит его на cron операционной системы" — что является нарушением работы WordPress, который должен быть независим от ОС. Другой разработчик заявляет: "это ответственность разработчика плагина предусмотреть уничтожение wp cron". Серьёзно? То есть, если вам нужна функциональность cron, вы должны ПЛАНИРОВАТЬ устранение системы cron? Какую тогда? Резервную систему cron? Этот комментарий не имеет смысла [очевидно].

John Dee John Dee
4 апр. 2020 г. 02:40:15

В любом случае, текущее состояние — "ПОЛНЫЙ ХАОС". Вот где мы сейчас. Единственное решение с точки зрения фреймворка — сказать людям: "ЕСТЬ ПРИЧИНА, ПОЧЕМУ СИСТЕМА WP-CRON СУЩЕСТВУЕТ. НЕ ОТКЛЮЧАЙТЕ ЕЁ". Альтернатива — 10 000 различных мнений. Что мы и имеем сейчас.

John Dee John Dee
4 апр. 2020 г. 02:41:39