Запуск WP Cron на багатосайтовому правильному шляху


18

У мене 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 вручну (так, ми можемо використовувати --urlattr). Наприклад:

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

Ви подивилися на WP-CLIосновний код?
кайзер

Так. Я копаюсь у вихідний код прямо зараз і намагаюся зрозуміти :) Команди для запуску всіх завдань (подій) не існує, можливо, я можу це створити в майбутньому.
Коля Коробочкін

У вас є wp/ WP-CLI у своєму PATH? Якщо так, то чому б не запустити це з файлу bash, що працює в cron?
кайзер

Звучить прекрасно! Але як запустити всі завдання cron з wp cli? Я не бачу ніяких команд для цього.
Коля Коробочкін

Точно так, як ви показали в кінці запитання?
кайзер

Відповіді:


13

Я думаю, що найкращим способом є використання 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 і запустити його, можливо, щохвилини, якщо вам подобається


Хм дякую за вашу думку, але я думаю, що це хакі (брудне) рішення. Я думаю, буде краще написати якийсь додаток PHP для wpcli, який просто запустить усі необхідні завдання. Мені потрібно більше часу, щоб зрозуміти функції WP і код, щоб це зробити.
Коля Коробочкін

4
@KolyaKorobochkin Я не згоден. Це зовсім не хакі, оскільки WP CLI був використаний для використання в командному рядку та в bash-скриптах.
DiverseAndRemote.com

1
wp cron event run --due-now --url="$SITE_URL" --path="$WP_PATH- Згідно з runдокументами, ви повинні використовувати --due-nowпрапор. Це призведе до скорочення пошукових запитів та окремих викликів подій. Дивіться: wp-cli.org/commands/cron/event/run . Так чи інакше, я з @OmarJackman - він використовує командний рядок для використання інструментів командного рядка WordPress. Реквізити для чистого прикладу Bash. Можна відповісти цією відповіддю, показавши запис крона.
jgraup

На користь майбутніх читачів сценарій виглядає так: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 wp cron event run --due-now --url="$SITE_URL" --path="$WP_PATH"; done
головоломка

10

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

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

WP-CLI

І якщо припустити, що у вас config.ymlналаштування правильно, ви можете опустити --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;

Якщо ви хочете, щоб вони працювали одночасно (спочатку запустіть немісцевий крон):

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

1

Простіший однолінійний з меншим розміром:

wp site list --field=url | xargs -i -n1 wp cron event run --due-now --url="{}"

Ви можете запустити його вручну або ввести його в сценарій і викликати його з cron, як і в інших відповідях.


0

Це моє рішення:

global $multisite_hosts;
$multisite_hosts = Array('xxxx.dev.xxx.oondeo.es','x2.dev.xxx.oondeo.es','x3.dev.xxx.oondeo.es');

function run_cron(){
  global $multisite_hosts;
  $host=array_pop($multisite_hosts);
  if (!$host)
    return;
  register_shutdown_function('shutdown');
  if (!isset($_SERVER['HTTP_HOST'])) {
       $_SERVER['HTTP_HOST'] = $host;  // replace with primary host
  }

  require './wp-cron.php';
}

function shutdown()
{
  run_cron();
}
run_cron();

Ми називаємо це з crontab, сподіваємось, що це допомагає


-5

Я думаю, вам потрібно сказати нам, що ви маєте на увазі під першим і головним "запуском wp-cron.php правильним шляхом". За словами Wordpress, не має сенсу вимкнути wp-cron і все ж хочете його запустити ... З точки зору Linux, wget-ing або / bin / php-ing wp-cron.php було б правильним, але здається, ваш конкретний хост обмежує вашу кількість викликів php з міркувань безпеки? - ця частина не зовсім зрозуміла з вашого опису.

Ще одне питання: скільки електронних листів "тонна"? Є великі причини, чому ви не повинні намагатися надсилати занадто багато електронних листів так швидко.

Можливо, вам доведеться переглянути свої цілі.

(Я б прокоментував замість відповіді, але мені не вистачає репутації на wpstack.)


3
Існує кілька способів запуску крона WordPress. Вбудований механізм спрацьовує за допомогою перегляду сторінок, і загальноприйнята практика встановлювати DISABLE_WP_CRONвимкнення цього методу при встановленні замість нього більш надійного методу cron.
Marcus Downing

Питання не в тому, чому це зробити / якщо причини значущі, а в тому, як правильно викликати wp-cron.php на багатосайтовій установці. Цілком зрозуміло для мене;)
Філіп

1
Сподіваюся, ви зрозуміли, що коментуєте дуже стару і вже приховану відповідь.
Хорхе Орпінель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.