web-dev-qa-db-ja.com

ランニング WP マルチサイトでのCronの正しい方法

私はWordPress Multisiteにいくつかのサイトを持っています。 DISABLE_WP_CRONwp-config.phptrueに設定しました。

Wgetまたはcurlを使用してクーロン・タスクを設定した場合、PHPスクリプトを実行するための30秒のルールがあります。大量の電子メール通知を送信したりその他のことを行うのは非常に小さい(おそらくリモートSMTPサーバー接続が遅い、多分それは本当にbbPressからの電子メール通知の束または何か)。

たぶん私たちはこのようなものを使うことができますか?

php -q wp-cron.php

しかし、それはMultisite内の1つのサイトに対してcronを実行するだけです(各サイトは異なるMySQLテーブルに独自のcronタスクを持っています)。

P. S. wpmudev.orgフォーラム Curlも使っている奇妙な "解決策"を見つけた。

別のP. S. WP CLIには素晴らしいwp cronコマンドがあります ただし、cronタスクを手動で実行することしかできません(--url attrを使用できます)。例えば:

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

私は最良の方法は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に追加して、必要に応じて毎分実行する必要があります。

12

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>…]実行する1つ以上のフック。

[--due-now]今期限が切れているすべてのフックを実行します。

[--all]全てのフックを実行します。


すべての期限付きクーロン・タスクを実行する

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から customコマンド を実行したい場合は、 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に対してpingを実行するだけなので、応答が何であるかはあまり気にしません。

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 );
}

そして、crontabであなたのcustom-cron.phpへの一回の呼び出しを追加してください。

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

これが私の解決策です:

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から呼び出します。

0
Amon-Ra