WP Cron'u çoklu sitede doğru şekilde çalıştırmak


18

Birkaç site ile WordPress Multisite var. Kurduğum DISABLE_WP_CRONiçin trueskinTenimde wp-config.php.

Wget veya curl ile cron görevini kurarsak, PHP betiğini çalıştırmak için 30 saniyelik bir kuralımız vardır. Tonlarca e-posta bildirimi göndermek ve başka şeyler yapmak çok küçük (belki uzak SMTP sunucu bağlantısı yavaş, belki bbPress veya herhangi bir şeyden e-posta bildirimleri gerçekten çok büyük).

Belki böyle bir şey kullanabiliriz?

php -q wp-cron.php

Ancak, Çoklu Sitede yalnızca bir siteye cron çalıştırır (her sitenin farklı MySQL tablolarında kendi cron görevleri vardır).

PS wpmudev.org forumunda da Curl kullanan garip bir "çözüm" buldum.

Başka bir PS WP CLI'nin harika wp cronkomutları var, ancak yalnızca cron görevlerini manuel olarak çalıştırmaya izin veriyor (evet, --urlattr kullanabiliriz ). Örneğin:

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

WP-CLIÇekirdek koda bir göz attınız mı?
kaiser

Evet. Şu anda kaynak kodunu kazıyorum ve anlamaya çalışıyorum :) Tüm görevleri (olayları) çalıştırma komutu yok, belki gelecekte oluşturabilirim.
Kolya Korobochkin

Eğer var mı wp/ WP-CLI Gözlerinde farklı PATH? Cevabınız evet ise, bunu neden cron'da çalışan bir bash dosyasından tetiklemiyorsunuz?
kaiser

Harika görünüyor! Ama wp cli tüm cron görevleri çalıştırmak için? Bunun için herhangi bir komut görmüyorum.
Kolya Korobochkin

Sorunuzun sonunda tam olarak gösterdiğiniz gibi?
kaiser

Yanıtlar:


13

En iyi yol WP-CLI kullanmak olduğunu düşünüyorum ama bunu yapmak için bir bash komut dosyası yazmak gerekir. İşte sizin için yapması gerekenler:

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 gerekir


Hm fikriniz için teşekkür ederim ama bunun çılgınca (kirli) bir çözüm olduğunu düşünüyorum. Ben sadece gerekli tüm görevleri çalıştırmak wpcli için bazı PHP addon yazmak daha iyi olacağını düşünüyorum. WP fonksiyonları ve bunu yapmak için kod anlamak için daha fazla zamana ihtiyacım var.
Kolya Korobochkin

4
@KolyaKorobochkin Katılıyorum. WP CLI komut satırında ve bash komut dosyalarında kullanılmak üzere yapıldığı için bu hiç de çılgın değil.
DiverseAndRemote.com

1
wp cron event run --due-now --url="$SITE_URL" --path="$WP_PATH- runDokümanlara göre , --due-nowbayrağı kullanmalısın . Bu, aramaları ve bireysel etkinlik çağrılarını azaltacaktır. Bkz . Wp-cli.org/commands/cron/event/run . Her iki durumda da, @OmarJackman ile birlikteyim - WordPress komut satırı araçlarını kullanmak için komut satırını kullanıyor. Temiz bir Bash örneği için aksesuarlar. Bu cevabı crontab girişini göstererek tamamlayabilirsiniz.
jgraup

Gelecekteki okuyucuların yararı için senaryo daha sonra şöyle görünür: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
şaşkınlık

10

Sabit değeri ekledikten sonra wp-config.php

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

WP-CLI

Ve config.ymlkurulumunuzu doğru şekilde yaptığınızı varsayarsak , --patharama yaparken bayrağa göz atabilirsiniz cron run.


wp cron event run --due-now

[<hook>…] Çalıştırmak için bir veya daha fazla kanca.

[--due-now] Şu anda tüm kancaları çalıştırın.

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


İçin kusura cron görevlerini çalıştırmak amacıyla:

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ışmalarını istiyorsanız (önce siteye özgü olmayan cronu ç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

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 özel bir komut çalıştırmak istiyorsanız , wp-cli'nun çalışması 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üklemeniz için tek neden, URL'leri önceden tanımlanmış bir liste kullanmak yerine veritabanından toplamaktır. Sadece bu URL'lere ping atacağız ve cevabı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 custom-cron.phpbir crontab'da tek bir çağrı ekleyin

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

1

Daha az bash ile daha kolay tek astar:

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

Elle çalıştırabilir veya bir komut dosyasına koyabilir ve diğer cevaplarda olduğu gibi cron'dan çağırabilirsiniz.


0

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 deniyoruz, umarım yardımcı olur


-5

Bence her şeyden önce "wp-cron.php'yi doğru şekilde çalıştırın" derken ne demek istediğinizi söylemeniz gerekir. Wordpress'e göre, wp-cron'u devre dışı bırakmanız ve yine de çalışmasını istemeniz mantıklı değil ... Linux perspektifinden, wget-ing veya / bin / php-ing wp-cron.php doğru olurdu, ancak belirli ana güvenlik nedenlerinden dolayı php invokasyon sayısını sınırlıyor gibi görünüyor? - bu bölüm açıklamanızdan tamamen açık değil.

Başka bir soru: "bir ton" kaç e-posta var? Çok fazla e-posta göndermeye çalışmamanız için harika nedenler var.

Hedeflerinizi yeniden düşünmek zorunda kalabilirsiniz.

(Yanıtlamak yerine yorum yapardım ama wpstack'ta yeterli itibarım yok.)


3
WordPress cronunu çalıştırmanın birden fazla yolu vardır. Yerleşik mekanizma sayfa görünümleriyle tetiklenir ve bunun DISABLE_WP_CRONyerine daha güvenilir sistem cron yöntemini ayarlarken bu yöntemi devre dışı bırakmak yaygın bir uygulamadır .
Marcus Downing

Soru neden yapılamıyor / nedenleri anlamlıysa, çok bölgeli bir kurulumda wp-cron.php'yi nasıl doğru arayacağınızdır. Benim için oldukça açık;)
Philipp

1
Umarım çok eski ve zaten gizli bir cevaba yorum yaptığınızı fark edersiniz.
Jorge Orpinel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.