Должен ли я отключить WP_CRON и вместо этого запускать wp-cron.php с сервера каждые несколько минут?

12

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

Есть ли у этого недостаток?

TheBigK
источник

Ответы:

15

Нет недостатка в запуске WP CRON с использованием заданий сервера 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://your-domain.com/wp-cron.php?doing_wp_cron

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

if ( !defined('ABSPATH') ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

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

Fayaz
источник
1
Документация WordPress.org, на которую вы ссылаетесь, wget http://YOUR_SITE_URL/wp-cron.phpбез добавления слов. ?doing_wp_cron Так один лучше другого? Что делает дополнение ?doing_wp_cron, чего не делает не версия?
Гарконис
Вероятно, именно так ваши журналы покажут строку запроса, чтобы вы знали, как она была вызвана с уверенностью.
Slbox
1
Я не согласен с этим вообще. Прежде всего, это не правда, что это «рекомендуется». Во-вторых, этот метод будет калечить любые плагины, которые используют фактический рекомендуемый метод планирования событий. Я думаю, что это действительно плохой совет. Почти никто не должен выключать cron, если у вас нет ОЧЕНЬ конкретной причины для этого. Единственная причина, о которой я могу подумать, это то, что вы ломаете WordPress за CDN или что-то в этом роде. Это НЕ нормальная практика.
Джон Ди
1
@JohnDee: этот метод фактически не отключает cron, он отключает метод WP Cron, который проверяет и пытается запускать задания cron при каждой загрузке страницы. define('DISABLE_WP_CRON', true);отключает только эту часть процесса cron, а затем вызывает скрипт cron с кодом вроде: */5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cronна сервере проверяет выполнение заданий cron. Любой плагин планирования даже не будет знать разницу.
Фаяз
1
WordPress.org документация ссылка на эту тему изменена на developer.wordpress.org/plugins/cron/...
aldemarcalazans
2

Есть несколько недостатков: во-первых, при использовании wp-cron.php в качестве cli, переменные $ _SERVER не устанавливаются. Люди преодолевают это ограничение, используя вместо этого запрос curl к wp-cron.php.

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

Однако; Я предпочитаю использовать wp-cli после настройки параметров почты в postfix и (для nginx) в конфигурации php-fpm и установки 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

(Перечислите все cron с определенными полями в формате csv - hook - это имя cron, относительное время следующего запуска - это время. Удалите те, которые показывают 'now' как следующий запуск (ожидаемые сейчас), используя AWK, передайте этот список xargs для вызовите wp cron event run $HOOKкаждый cron.) Использование wp-cli корректно загружает WordPress (я предпочитаю пропускать плагины при перечислении cron, так как предупреждения об ошибках кода и php испортят вывод сценариев; но не пропускать их при запуске cron с xargs, так как cron может потребоваться загрузка плагинов)

Надеюсь, это даст вам несколько советов о том, на что обратить внимание.

TechnicalChaos
источник
2
Как насчет настройки: / 15 * * * wget -q -O - yourdomain.com/wp-cron.php?doing_wp_cron в соответствии с предложением TomMcFarlin - tommcfarlin.com/wordpress-cron-jobs . Кажется, делать работу хорошо. Буду признателен за ваш комментарий.
TheBigK
Да, как я уже упоминал, люди выбирают curl (wget или любой другой http-вызов) для запуска крон, и в этом методе нет ничего плохого. Я просто советовал проблемы непосредственного вызова php-файла wp-cron, который не будет включать необходимые файлы, и советовал другой альтернативный метод, если вы хотите немного оживить его.
TechnicalChaos
0

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

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

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

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

Джон Ди
источник
2
Это ужасный ответ - они НЕ ОТКАЗЫВАЮТ WP Cron. Они просто отключают вызов WP Cron при загрузке страницы и вместо этого выгружают его в системный демон cron. Sheesh.
Барри Чепмен
В любом случае, основная причина оставить это в покое состоит в том, что многие плагины теперь используют cron для запуска расширенной фоновой задачи. Вы можете испортить то, что делает СЛЕДУЮЩИЙ человек, потому что он ожидает, что система будет работать стандартным образом. Удачи!
Джон Ди
если плагин закодирован таким образом, что он полностью ломается, если wp cron отключен, то это означает, что он был запрограммирован некомпетентным, и лучше немедленно удалить его.
Magnetic_dud
Ну, два комментария здесь подтверждают мою точку зрения. У вас есть один разработчик, который говорит: «Это не отключает cron, это просто перетасовывает его в OS cron», что является прорывом в WordPress, который не зависит от ОС. Затем другой разработчик говорит: «Эй, разработчик плагинов несет ответственность за планирование уничтожения wp cron». Ну хорошо Итак, если вам нужна функциональность cron, вам следует использовать PLAN для устранения системы cron? К чему? Резервная система cron? Этот комментарий не имеет смысла [очевидно].
Джон Ди
В любом случае, текущее состояние - «ВСЕГО СМЕШЕНИЯ». Это текущее состояние. Единственное решение от Pv для каркасов - это сказать людям: ЭТО ПРИЧИНА, ЧТО СУЩЕСТВУЕТ СИСТЕМА WP-CRON. НЕ ВЫКЛЮЧАЙТЕ ЭТО. Другой вариант - 10 000 разных, разных мнений. Что есть у нас сейчас.
Джон Ди
0

Я еще не нашел реального недостатка в разгрузке wp-cron на внешние сервисы. Заниматься этим уже много лет.

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

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

Это уменьшает нагрузку на внутренние узлы и повышает безопасность благодаря меньшей площади атаки.

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

Радослав Стефанов
источник