it-swarm-id.com

Lari WP Cron on multisite dengan cara yang benar

Saya memiliki WordPress Multisite dengan beberapa situs. Saya mengatur DISABLE_WP_CRON menjadi true di wp-config.php saya.

Jika kita mengatur tugas cron dengan wget atau curl, kita memiliki aturan 30 detik untuk menjalankan skrip PHP. Sangat kecil untuk mengirim banyak notifikasi email dan melakukan hal-hal lain (mungkin koneksi server SMTP jauh lambat, mungkin banyak sekali notifikasi email dari bbPress atau apa pun).

Mungkin kita bisa menggunakan sesuatu seperti ini?

php -q wp-cron.php

Tapi itu hanya menjalankan cron ke satu situs di Multisite (setiap situs memiliki tugas cron sendiri di tabel MySQL yang berbeda).

P. S. Pada forum wpmudev.org Saya menemukan "solusi" aneh yang juga menggunakan Curl.

P. S. WP _ CLI lain punya perintah wp cron yang mengagumkan tapi itu hanya memungkinkan menjalankan tugas cron secara manual (ya, kita bisa menggunakan --url attr). Sebagai contoh:

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

Saya pikir cara terbaik adalah menggunakan WP-CLI tetapi Anda harus menulis skrip bash untuk melakukan ini. Inilah salah satu yang harus dilakukan untuk Anda:

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

Anda kemudian perlu menambahkan skrip ini ke crontab dan menjalankannya mungkin setiap menit jika Anda mau

12

Setelah menambahkan konstanta di wp-config.php

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

WP-CLI

Dan dengan asumsi Anda memiliki config.yml setup dengan benar, Anda dapat menghilangkan bendera --path saat memanggil cron run .


wp cron event run --due-now

[<hook>…] Satu atau lebih kait untuk dijalankan.

[--due-now] Jalankan semua kait karena sekarang.

[--all] Jalankan semua kait.


Ke menjalankan semua tugas cron yang seharusnya dalam urutan:

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;

Jika Anda ingin mereka menjalankan secara bersamaan (pertama-tama jalankan cron non-situs-spesifik):

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;

Anda ingin menempatkan salah satu opsi di file yang dapat dieksekusi

chmod +x run_all_wp_cron_events_due_now.sh

tambahkan tugas crontab

crontab -e

dan mungkin mengeksekusi setiap menit

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

Jika Anda ingin menjalankan perintah khusus dari cron, Anda mungkin perlu menentukan path lengkap untuk wp-cli untuk bekerja.

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

PHP

Satu-satunya alasan Anda perlu memuat WordPress di sini adalah untuk mengumpulkan URL dari database daripada menggunakan daftar yang telah ditentukan. Kami hanya akan mem-ping URL-URL itu dan kami tidak begitu peduli apa jawabannya.

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

Dan tambahkan satu panggilan ke custom-cron.php Anda di crontab

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

Ini solusi saya:

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

Kami menyebutnya dari crontab, semoga membantu

0
Amon-Ra