当前位置: 首页>>技术教程>>正文


正确地在多站点上运行WP Cron

webfans 技术教程 , , , , , 去评论

问题描述

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

如果我们用wget或curl设置cron任务,我们有30秒的规则来执行PHP脚本。它发送大量的电子邮件通知并做其他事情是如此之小(可能远程SMTP服务器连接速度很慢,也许它真的是来自bbPress或其他任何东西的大量电子邮件通知)。

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

php -q wp-cron.php

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

P. S. On wpmudev.org forum我发现奇怪的”solution”也使用了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

最佳解决办法

我认为最好的方法是使用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,则可以在调用cron run时省略--path标志。


wp cron event run --due-now

[<hook>…] One or more hooks to run.

[--due-now] Run all hooks due right now.

[--all] Run all hooks.


按顺序到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;

如果您希望它们同时运行(首先运行non-site-specific 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 command,可能需要指定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而不是使用pre-defined列表。我们只会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

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2265.html,转载请务必附带本地址声明。