我有多个站点的WordPress Multisite。我在DISABLE_WP_CRON中将true设置为wp-config.php

如果使用wget或curl设置cron任务,则有30秒的规则来执行PHP脚本。发送大量电子邮件通知和执行其他操作是如此之小(也许远程SMTP服务器连接速度很慢,也许来自bbPress或其他任何东西的电子邮件通知确实很大)。

也许我们可以使用类似

php -q wp-cron.php


但是它只能在多站点中的一个站点上运行cron(每个站点在不同的MySQL表中都有自己的cron任务)。

P。 S.在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


评论

您是否看过WP-CLI核心代码?

是。我现在研究源代码并试图理解:)运行所有任务(事件)的命令不存在,也许我将来可以创建它。

您的路径中是否有wp / WP-CLI?如果是,为什么不从cron中运行的bash文件触发该事件?

听起来不错!但是如何从wp cli运行所有cron任务?我看不到任何命令。

正是您在问题末尾所显示的一样?

#1 楼

我认为最好的方法是使用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  }')
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 }')
    do
        wp cron event run "$EVENT_HOOK" --url="$SITE_URL" --path="$WP_PATH"
    done
done


然后,您需要将此脚本添加到crontab并在需要时每分钟运行一次,如果您愿意的话

评论


嗯,谢谢您的意见,但我认为这是不可靠的(肮脏的)解决方案。我认为最好为wpcli编写一些PHP插件,使其仅运行所有需要的任务。我需要更多时间来了解WP函数和代码来做到这一点。

–科里亚·科罗伯奇金(Kolya Korobochkin)
2015年1月31日14:15

@KolyaKorobochkin我不同意。由于WP CLI可以在命令行和bash脚本中使用,所以这根本不是问题。

– DiverseAndRemote.com
2015年12月3日,18:15



wp cron事件运行--due-now --url =“ $ SITE_URL” --path =“ $ WP_PATH-根据运行文档,您应该使用--due-now标志,这将减少查找和单个事件无论哪种方式,我都使用@OmarJackman-他利用命令行来使用WordPress命令行工具。一个干净的Bash示例的道具。你可以四舍五入通过显示crontab条目来找出答案。

– jgraup
16 Sep 14 '16:18



为了将来的读者受益,脚本如下所示:WP_PATH =“ / path / to / wp”; $(wp网站列表--fields = domain,path,archived,deleted --format = csv --path =“ $ WP_PATH” | grep“,0,0 $” | awk -F',''{打印$ 1 $ 2}');做wp cron事件运行--due-now --url =“ $ SITE_URL” --path =“ $ WP_PATH”;完成

–困惑
17年4月16日在0:44



#2 楼

wp-config.php中添加常量后,假设您正确设置了config.yml,则可以忽略以下内容:调用--path时的cron run标志。


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



[<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;

您想将两个选项中的任何一个放入可执行文件中。

wp cron event run --due-now


添加crontab任务

chmod +x run_all_wp_cron_events_due_now.sh


并可能每分钟执行一次

crontab -e


如果要从cron运行自定义命令,则可能需要指定wp的完整路径-cli正常工作。

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



PHP
您需要在此处加载WordPress的唯一原因是从数据库中收集URL,而不是使用预定义列表。我们只是要对这些URL进行ping操作,我们实际上并不关心响应是什么。


custom-cron.php


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


并在crontab中向您的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 );
}


#3 楼

简化操作,减少bash:

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

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

评论


正是我想要的-效果与广告一样,谢谢!

– kero
20-10-15在11:19

#4 楼

这是我的解决方案:

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上没有足够的声誉。)

评论


有多种运行WordPress cron的方法。内置机制由页面视图触发,通常的做法是设置DISABLE_WP_CRON以在设置更可靠的系统cron方法时禁用此方法。

–马库斯·唐宁(Marcus Downing)
16年7月11日在14:28

问题不是为什么要这样做/原因是否有意义,而是如何在多站点安装上正确调用wp-cron.php。我很清楚;)

– Philipp
17-10-26在20:26

希望您意识到您正在评论一个非常古老且已经隐藏的答案。

–乔治·奥皮内尔(Jorge Orpinel)
17-10-27在21:03