it-swarm-tr.com

Koşu WP Multisite Cron doğru yolda

WordPress Multisite’a birkaç sitem var. DISABLE_WP_CRON içinde wp-config.php ile true ayarını yaptım.

Wron veya curl ile cron görevi kurarsak, PHP betiğini yürütmek için 30 sn kuralımız vardır. Tonlarca e-posta bildirimi göndermek ve başka şeyler yapmak çok küçük (belki de uzak SMTP sunucusu bağlantısı yavaş, belki de bbPress veya başka bir şeyden gelen çok büyük e-posta bildirimleri var).

Belki böyle bir şey kullanabiliriz?

php -q wp-cron.php

Ancak, Multisite’deki bir siteye yalnızca cron çalıştırılıyor (her sitenin farklı MySQL tablolarında kendi cron görevleri var).

P. S. wpmudev.org forumunda Curl'u da kullanan garip bir "çözüm" buldum.

Başka bir P. S. WP CLI harika wp cron komutlarına sahiptir fakat sadece cron görevlerini elle çalıştırmanıza izin verir (evet, --url attr kullanabiliriz). Örneğin:

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

Bence en iyi yol WP-CLI'yi kullanmak ama bunun için bir bash betiği yazmanız gerekecek. İşte sizin için yapması gerekenlerden biri:

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

Daha sonra bu betiği crontab'a eklemeniz ve isterseniz her dakika çalıştırmanız gerekebilir.

12

wp-config.php içindeki sabiti ekledikten sonra

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

WP-CLI

Ve config.yml kurulumunuzun doğru olduğunu varsayarsak, --path öğesini çağırırken cron run bayrağını bırakabilirsiniz.


wp cron event run --due-now

[<hook>…] Çalıştırılacak bir veya daha fazla kanca.

[--due-now] Tüm kancaları hemen şimdi çalıştır.

[--all] Tüm kancaları çalıştır.


Tüm cron görevlerini çalıştır 'a sırayla:

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;

Eşzamanlı olarak çalıştırılmalarını istiyorsanız (önce sahaya özgü olmayan cronları çalıştırma):

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;

Her iki seçeneği de yürütülebilir bir dosyaya koymak istersiniz

chmod +x run_all_wp_cron_events_due_now.sh

bir crontab görevi ekle

crontab -e

ve muhtemelen her dakikayı çalıştır

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

Cron'dan custom command komutunu çalıştırmak istiyorsanız, çalışmak için wp-cli için tam yolları belirtmeniz gerekebilir.

* * * * * 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'i buraya yüklemenizin tek nedeni URL'leri önceden tanımlanmış bir liste kullanmak yerine veritabanından toplamaktır. Yalnızca bu URL’leri pingleyeceğiz ve yanıtın ne olduğunu gerçekten umursamıyoruz.

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

Ve bir crontab içindeki custom-cron.php adresinize tek bir çağrı ekleyin.

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

Bu benim çözümüm:

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

Buna crontab diyoruz, yardımcı olacağını umuyorum

0
Amon-Ra