รัน WP Cron บนหลายไซต์ทางที่ถูกต้อง


18

ฉันมี WordPress Multisite กับเว็บไซต์หลายแห่ง ฉันจะตั้งค่าDISABLE_WP_CRONไปในของฉันtruewp-config.php

ถ้าเราตั้งค่า cron task ด้วย wget หรือ curl เรามีกฎ 30 วินาทีในการรันสคริปต์ PHP มีขนาดเล็กมากที่จะส่งการแจ้งเตือนทางอีเมลและทำสิ่งอื่น ๆ (การเชื่อมต่อเซิร์ฟเวอร์ SMTP ระยะไกลอาจช้า, บางทีมันอาจเป็นกลุ่มการแจ้งเตือนทางอีเมลขนาดใหญ่มากจาก bbPress หรืออะไรก็ได้)

บางทีเราสามารถใช้บางอย่างเช่นนี้?

php -q wp-cron.php

แต่มันจะเรียกใช้ cron เพียงหนึ่งไซต์ใน Multisite (แต่ละไซต์มีภารกิจ cron ของตัวเองในตาราง MySQL ที่แตกต่างกัน)

PS บนฟอรัม wpmudev.orgฉันพบ "วิธีแก้ปัญหา" ที่แปลกซึ่งใช้ Curl

PS WP CLI อื่นมีwp cronคำสั่งที่ยอดเยี่ยมแต่อนุญาตให้เรียกใช้งาน cron ด้วยตนเองเท่านั้น (ใช่เราสามารถใช้--urlattr) ตัวอย่างเช่น:

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

คุณเคยดูWP-CLIรหัสแกนไหม?
ไกเซอร์

ใช่. ฉันขุดลงในซอร์สโค้ดตอนนี้และพยายามเข้าใจ :) คำสั่งเพื่อเรียกใช้งานทั้งหมด (เหตุการณ์) ไม่มีอยู่บางทีฉันสามารถสร้างมันได้ในอนาคต
Kolya Korobochkin

คุณมีwp/ WP-CLIในตัวคุณPATHหรือไม่? ถ้าใช่ทำไมไม่ทริกเกอร์ไฟล์ bash นั้นทำงานเป็น cron
ไกเซอร์

ฟังดูดี! แต่วิธีการเรียกใช้งาน cron ทั้งหมดจาก wp cli? ฉันไม่เห็นคำสั่งใด ๆ สำหรับสิ่งนี้
Kolya Korobochkin

ตรงตามที่คุณแสดงในตอนท้ายของคำถามของคุณ?
ไกเซอร์

คำตอบ:


13

ฉันคิดว่าวิธีที่ดีที่สุดคือใช้ WP-CLI แต่คุณต้องเขียนสคริปต์ทุบตีเพื่อทำสิ่งนี้ นี่คือสิ่งที่ควรทำเพื่อคุณ:

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 และรันทุก ๆ นาทีถ้าคุณต้องการ


หืมขอบคุณสำหรับความคิดเห็นของคุณ แต่ฉันคิดว่านี่เป็นวิธีแก้ปัญหาแฮ็ก (สกปรก) ฉันคิดว่าจะเป็นการดีกว่าที่จะเขียน PHP addon สำหรับ wpcli ซึ่งเพิ่งทำงานทุกอย่างที่จำเป็น ฉันต้องการเวลามากขึ้นในการทำความเข้าใจกับฟังก์ชั่น WP และรหัสเพื่อทำมัน
Kolya Korobochkin

4
@ KolyaKorobochkin ฉันไม่เห็นด้วย นี่ไม่ใช่แฮ็คเลยตั้งแต่ WP CLI ถูกสร้างขึ้นเพื่อใช้ในบรรทัดคำสั่งและในสคริปต์ทุบตี
DiverseAndRemote.com

1
wp cron event run --due-now --url="$SITE_URL" --path="$WP_PATH- ตามrunเอกสารคุณควรใช้--due-nowค่าสถานะ วิธีนี้จะลดการค้นหาและการเรียกเหตุการณ์แต่ละรายการ ดู: wp-cli.org/commands/cron/event/run ทั้งสองวิธีฉันใช้ @OmarJackman - เขาใช้ประโยชน์จากบรรทัดคำสั่งเพื่อใช้เครื่องมือบรรทัดคำสั่งของ WordPress อุปกรณ์ประกอบฉากสำหรับตัวอย่างทุบตีสะอาด คุณสามารถปัดเศษคำตอบนี้โดยการแสดงรายการ crontab
jgraup

เพื่อประโยชน์ของผู้อ่านในอนาคตสคริปต์ก็มีลักษณะดังนี้: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
ไขปริศนา

10

หลังจากที่คุณเพิ่มค่าคงที่ใน wp-config.php

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

WP-CLI

และสมมติว่าคุณมีของคุณconfig.ymlติดตั้งอย่างถูกต้องคุณสามารถ ommit ธงเมื่อโทร--pathcron run


wp cron event run --due-now

[<hook>…] หนึ่งหรือมากกว่าหนึ่งตะขอที่จะทำงาน

[--due-now] เรียกใช้ hooks ทั้งหมดเนื่องจากตอนนี้

[--all] เรียกใช้ hooks ทั้งหมด


ในการรันภารกิจ cron ทั้งหมดตามลำดับ:

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;

หากคุณต้องการให้พวกเขาทำงานพร้อมกัน (ใช้ 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 คุณอาจต้องระบุพา ธ เต็มเพื่อให้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 จากฐานข้อมูลแทนที่จะใช้รายการที่กำหนดไว้ล่วงหน้า เราจะ ping URL เหล่านั้นเท่านั้นและเราไม่สนใจว่าคำตอบคืออะไร

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

และเพิ่มสายเดียวให้กับคุณcustom-cron.phpใน crontab

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

1

ง่ายกว่าซับหนึ่งที่มีแรงกระแทกน้อยกว่า:

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

คุณสามารถรันด้วยตนเองหรือวางไว้ในสคริปต์และโทรจาก cron เช่นเดียวกับคำตอบอื่น ๆ


0

นี่คือทางออกของฉัน:

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

เราเรียกสิ่งนี้จาก crontab หวังว่าจะช่วยได้


-5

ฉันคิดว่าคุณต้องบอกเราว่าคุณหมายถึงอะไรโดย "รัน wp-cron.php อย่างถูกวิธี" ก่อนอื่น ตาม Wordpress มันไม่สมเหตุสมผลที่คุณปิดการใช้งาน wp-cron และยังต้องการให้มันรัน ... จากมุมมองของ Linux, wget-ing หรือ / bin / php-ing wp-cron.php จะถูกต้อง แต่ ดูเหมือนว่าโฮสต์เฉพาะของคุณกำลัง จำกัด จำนวนการเรียกใช้ php ของคุณด้วยเหตุผลด้านความปลอดภัย? - ส่วนนั้นยังไม่ชัดเจนจากคำอธิบายของคุณ

คำถามอื่น: จำนวนอีเมล "a ton" เป็นเท่าใด มีเหตุผลที่ดีว่าทำไมคุณไม่ควรพยายามส่งอีเมลมากเกินไปอย่างรวดเร็ว

คุณอาจต้องคิดใหม่อีกครั้งถึงวัตถุประสงค์ของคุณ

(ฉันจะแสดงความคิดเห็นแทนการตอบกลับ แต่ฉันไม่มีชื่อเสียงเพียงพอใน wpstack)


3
มีหลายวิธีในการรัน WordPress cron กลไกภายในถูกเรียกใช้โดยการดูหน้าเว็บและเป็นวิธีปฏิบัติทั่วไปในการตั้งค่าDISABLE_WP_CRONให้ปิดใช้งานวิธีนี้เมื่อตั้งค่าวิธีระบบ cron ที่เชื่อถือได้มากกว่าแทน
Marcus Downing

คำถามไม่ได้ว่าทำไมจะทำมัน / ถ้าเหตุผลที่มีความหมาย แต่วิธีการอย่างถูกต้องเรียก WP-cron.php ในการติดตั้ง MultiSite การ ค่อนข้างชัดเจนสำหรับฉัน;)
ฟิลิปป์

1
ฉันหวังว่าคุณจะรู้ว่าคุณกำลังแสดงความคิดเห็นในคำตอบที่เก่ามากและซ่อนอยู่แล้ว
Jorge Orpinel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.