Menjalankan WP Cron di multisite dengan cara yang benar

18

Saya memiliki WordPress Multisite dengan beberapa situs. Aku mengatur DISABLE_WP_CRONuntuk truedi saya wp-config.php.

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 mereka sendiri dalam tabel MySQL yang berbeda).

PS Di forum wpmudev.org saya menemukan "solusi" aneh yang juga menggunakan Curl.

CLIwp cron PS WP lain memiliki perintah yang luar biasa tetapi hanya memungkinkan menjalankan tugas cron secara manual (ya, kita bisa menggunakan --urlattr). Sebagai contoh:

wp cron event list --url=multisite.com
wp cron event list --url=subdomain.multisite.com
Kolya Korobochkin
sumber
Sudahkah Anda melihat WP-CLIkode inti?
kaiser
Iya. Saya menggali ke dalam kode sumber sekarang dan mencoba untuk memahami :) Perintah untuk menjalankan semua tugas (peristiwa) tidak ada, mungkin saya dapat membuatnya di masa depan.
Kolya Korobochkin
Apakah Anda memiliki wp/ WP-CLI di Anda PATH? Jika ya, mengapa tidak memicu itu dari file bash yang berjalan di cron?
kaiser
Kedengarannya bagus! Tetapi bagaimana menjalankan semua tugas cron dari wp cli? Saya tidak melihat perintah untuk ini.
Kolya Korobochkin
Persis seperti yang Anda tunjukkan di akhir pertanyaan?
kaiser

Jawaban:

13

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

DiverseAndRemote.com
sumber
Hm terima kasih atas pendapat Anda tapi saya pikir ini adalah solusi yang kotor (kotor). Saya pikir akan lebih baik menulis beberapa addon PHP untuk wpcli yang menjalankan semua tugas yang diperlukan. Saya perlu lebih banyak waktu untuk memahami fungsi dan kode WP untuk melakukannya.
Kolya Korobochkin
4
@KolyaKorobochkin saya tidak setuju. Ini bukan hacky sama sekali karena WP CLI dibuat untuk digunakan pada baris perintah dan dalam skrip bash.
DiverseAndRemote.com
1
wp cron event run --due-now --url="$SITE_URL" --path="$WP_PATH- Menurut rundokumen, Anda harus menggunakan --due-nowbendera. Ini akan mengurangi pencarian dan panggilan acara individu. Lihat: wp-cli.org/commands/cron/event/run . Either way, saya dengan @OmarJackman - dia menggunakan baris perintah untuk menggunakan alat baris perintah WordPress. Alat peraga untuk contoh Bash yang bersih. Anda bisa melengkapi jawaban ini dengan menunjukkan entri crontab.
jgraup
Demi kepentingan pembaca di masa mendatang, skrip tersebut akan terlihat seperti: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 wp cron event run --due-now --url="$SITE_URL" --path="$WP_PATH"; done
kebingungan
10

Setelah menambahkan konstanta di wp-config.php

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

WP-CLI

Dan dengan anggapan Anda memiliki config.ymlpengaturan dengan benar, Anda dapat menghilangkan --pathbendera saat menelepon 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.


Untuk menjalankan semua tugas karena cron 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 agar wp-cli berfungsi.

* * * * * 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 melakukan ping ke URL-URL itu dan kami tidak terlalu 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 Anda custom-cron.phpdi crontab

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

Satu-liner yang lebih mudah dengan lebih sedikit bash:

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

Anda dapat menjalankannya secara manual atau memasukkannya ke dalam skrip dan memanggilnya dari cron seperti pada jawaban lainnya.

Anastis
sumber
0

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

Amon-Ra
sumber
-5

Saya pikir Anda perlu memberi tahu kami apa yang Anda maksud dengan "jalankan wp-cron.php dengan cara yang benar" pertama dan terutama. Menurut Wordpress, tidak masuk akal bahwa Anda menonaktifkan wp-cron dan tetap ingin menjalankannya ... Dari perspektif Linux, wget-ing atau / bin / php-ing wp-cron.php akan benar, tetapi tampaknya host khusus Anda membatasi jumlah pemanggilan php Anda karena alasan keamanan? - bagian itu tidak sepenuhnya jelas dari deskripsi Anda.

Pertanyaan lain: berapa banyak email "satu ton"? Ada alasan bagus mengapa Anda tidak boleh mencoba mengirim terlalu banyak email dengan cepat.

Anda mungkin harus memikirkan kembali tujuan Anda.

(Saya lebih suka berkomentar daripada membalas tetapi saya tidak memiliki reputasi yang cukup di wpstack.)

Jorge Orpinel
sumber
3
Ada beberapa cara menjalankan cron WordPress. Mekanisme bawaan dipicu oleh tampilan halaman, dan merupakan praktik umum DISABLE_WP_CRONuntuk menonaktifkan metode ini saat menyiapkan metode cron sistem yang lebih andal.
Marcus Downing
Pertanyaannya bukan mengapa melakukannya / jika alasannya bermakna tetapi bagaimana memanggil wp-cron.php dengan benar pada instalasi multisite. Cukup jelas bagi saya;)
Philipp
1
Saya harap Anda menyadari bahwa Anda mengomentari jawaban yang sangat lama dan sudah tersembunyi.
Jorge Orpinel