以正确的方式在多站点上运行WP Cron

时间:2014-11-03 作者:Kolya Korobochkin

我有多个网站的WordPress Multisite。我设置了DISABLE_WP_CRONtrue 在我的wp-config.php.

如果我们使用wget或curl设置cron任务,则有30秒的规则来执行PHP脚本。它太小了,无法发送成吨的电子邮件通知和做其他事情(可能远程SMTP服务器连接很慢,可能是来自bbPress的大量电子邮件通知或其他任何东西)。

也许我们可以用这样的东西?

php -q wp-cron.php
但它只能在多站点中对一个站点运行cron(每个站点在不同的MySQL表中都有自己的cron任务)。

P、 S。On wpmudev.org forum 我发现了奇怪的“解决方案”,它也使用旋度。

另一个P.S。WP CLI have awesome wp cron commands 但它只允许手动运行cron任务(是的,我们可以使用--url 属性)。例如:

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

5 个回复
SO网友:DiverseAndRemote.com

我认为最好的方法是使用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中,如果愿意,可以每分钟运行一次

SO网友:jgraup

将常量添加到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] 运行所有挂钩。


run all due cron tasks 按顺序:

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
如果要运行custom command 从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
您需要在此处加载WordPress的唯一原因是从数据库收集URL,而不是使用预定义的列表。我们只会ping这些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

SO网友:Anastis

更简单的一行,打击更少:

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

您可以手动运行它,也可以将其放入脚本中,然后像其他答案一样从cron调用它。

SO网友:Amon-Ra

这是我的解决方案:

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,希望能有所帮助

SO网友:Jorge Orpinel Pérez

我认为您首先需要告诉我们“以正确的方式运行wp-cron.php”是什么意思。根据Wordpress的说法,禁用wp cron却希望它运行是没有意义的。。。从Linux的角度来看,wget-ing或/bin/php-ing-wp-cron。php是正确的,但似乎您的特定主机出于安全原因限制了php调用的数量?--从你的描述中,那部分并不完全清楚。

另一个问题:“一吨”有多少封电子邮件?你不应该那么快地发送太多电子邮件,这有很多原因。

你可能需要重新思考你的目标。

(我会发表评论而不是回复,但我在wpstack上没有足够的声誉。)

结束

相关推荐

GET_TERM_LINK将以Single.php结尾

我有这样一个模板:页面电影。php分类电影。php分类法。php,我使用get_term_link() 在page-movie.php 在中列出并从索引页链接到该术语下所有自定义帖子类型的列表taxonomy-movie.php 但这将以single.php 用户单击所列术语之一时的页面!<?php $tax = \'movieTax\'; $args = array( \'hide_empty\' => false, \'ord