Intereting Posts

Запуск WP Cron на многоузловом правильном пути

У меня есть WordPress Multisite с несколькими сайтами. Я установил DISABLE_WP_CRON в true в моем wp-config.php .

Если мы создадим задачу cron с помощью wget или curl, у нас есть правило 30 секунд для выполнения PHP-скрипта. Это так мало, чтобы отправлять тонны уведомлений по электронной почте и делать другие вещи (возможно, удаленное соединение с SMTP-сервером происходит медленно, возможно, это действительно огромная совокупность уведомлений по электронной почте от bbPress или что-то еще).

Может быть, мы можем использовать что-то вроде этого?

 php -q wp-cron.php 

Но это только запуск cron на один сайт в Multisite (каждый сайт имеет свои собственные задачи cron в разных таблицах MySQL).

PS На форуме wpmudev.org я нашел странное «решение», которое также использует Curl.

Еще один PS WP CLI имеет потрясающие команды wp cron но он позволяет запускать задачи cron вручную (да, мы можем использовать --url attr). Например:

 wp cron event list --url=multisite.com wp cron event list --url=subdomain.multisite.com 

Solutions Collecting From Web of "Запуск WP Cron на многоузловом правильном пути"

Я думаю, что лучший способ – использовать WP-CLI, но вам нужно будет написать сценарий bash для этого. Вот тот, который должен сделать это за вас:

 WP_PATH="/path/to/wp" for SITE_URL in = $(wp site list --fields=domain,path,archived,deleted --format=csv --path="$WP_PATH" | grep ",0,0$" | awk -F ',' '{print $1 $2}') do for EVENT_HOOK in $(wp cron event list --format=csv --fields=hook,next_run_relative --url="$SITE_URL" --path="$WP_PATH" | grep \"now\"$ | awk -F ',' '{print $1}') do wp cron event run "$EVENT_HOOK" --url="$SITE_URL" --path="$WP_PATH" done done 

Затем вам нужно добавить этот скрипт в crontab и запустить его, может быть, каждую минуту, если вам нравится

После добавления константы в wp-config.php

 defined('DISABLE_WP_CRON') or define('DISABLE_WP_CRON', true); 

WP-CLI

Предполагая, что у вас есть config.yml настройка config.yml , вы можете --path флаг --path при вызове cron run .


 wp cron event run --due-now 

[<hook>…] Один или несколько крючков для запуска.

[--due-now] Запустить все перехватчики сейчас.

[--all] Запустите все перехватчики.


Для выполнения всех задач cron в порядке:

function run_crons_due_now_in_order { for SITE_URL in $(wp site list --fields=url --format=csv | tail -n +2 | sort); do wp cron event run --due-now --url="$SITE_URL" && echo -e "\t+ Finished crons for $SITE_URL"; done; echo "Done"; }; run_crons_due_now_in_order;

Если вы хотите, чтобы они выполнялись одновременно (сначала выполнялись не связанные с сайтом cron):

function run_all_crons_due_now { for SITE_URL in $(wp site list --fields=url --format=csv | tail -n +2 | sort); do wp cron event run --due-now --url="$SITE_URL" && echo -e "\t+ Finished crons for $SITE_URL" & done; wait $(jobs -p); echo "Done"; }; run_all_crons_due_now;

Вы хотите поставить любой вариант в исполняемый файл

 chmod +x run_all_wp_cron_events_due_now.sh 

добавить задачу crontab

 crontab -e 

и, вероятно, выполнять каждую минуту

 * * * * * run_all_wp_cron_events_due_now.sh > /dev/null 

Если вы хотите запустить пользовательскую команду из cron, вам может потребоваться указать полные пути для работы wp-cli .

 * * * * * cd /home/username/public_html; /usr/local/bin/php /home/username/wp-cli.phar your-custom-cron-commands run >/dev/null 2>&1 

PHP

Единственная причина, по которой вам нужно будет загрузить WordPress, это собрать URL-адреса из базы данных, а не использовать предварительно определенный список. Мы будем собирать только эти URL-адреса, и нам все равно, что такое ответ.

custom-cron.php

 <?php // Load WP require_once( dirname( __FILE__ ) . '/wp-load.php' ); // Check Version global $wp_version; $gt_4_6 = version_compare( $wp_version, '4.6.0', '>=' ); // Get Blogs $args = array( 'archived' => 0, 'deleted' => 0, 'public' => 1 ); $blogs = $gt_4_6 ? get_sites( $args ) : @wp_get_sites( $args ); // >= 4.6 // Run Cron on each blog echo "Running Crons: " . PHP_EOL; $agent = 'WordPress/' . $wp_version . '; ' . home_url(); $time = time(); foreach ( $blogs as $blog ) { $domain = $gt_4_6 ? $blog->domain : $blog['domain']; $path = $gt_4_6 ? $blog->path : $blog['path']; $command = "http://" . $domain . ( $path ? $path : '/' ) . 'wp-cron.php?doing_wp_cron=' . $time . '&ver=' . $wp_version; $ch = curl_init( $command ); $rc = curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false ); $rc = curl_exec( $ch ); curl_close( $ch ); print_r( $rc ); print_r( "\t✔ " . $command . PHP_EOL ); } 

И добавьте один вызов к вашему custom-cron.php в crontab

 * * * * * wget -q -O - http://your-site.com/custom-cron.php?doing_wp_cron 

Я думаю, вам нужно рассказать нам, что вы подразумеваете под «запустить wp-cron.php правильный путь» в первую очередь. Согласно WordPress, не имеет смысла, что вы отключите wp-cron и все же хотите, чтобы он запускался … С точки зрения Linux, wget-ing или / bin / php-ing wp-cron.php были бы правильными, но кажется, ваш конкретный хост ограничивает количество запросов php по соображениям безопасности? – эта часть не совсем понятна из вашего описания.

Другой вопрос: сколько писем «тонна»? Есть большие причины, по которым вы не должны пытаться отправлять слишком много писем, которые бы быстро.

Возможно, вам придется переосмыслить свои цели.

(Я бы прокомментировал вместо ответа, но у меня недостаточно репутации на wpstack.)