सही तरीके से मल्टीसिट पर WP Cron चलाना


18

मेरे पास कई साइटों के साथ वर्डप्रेस मल्टीसाइट है। मैं की स्थापना DISABLE_WP_CRONकरने के लिए trueमेरे में wp-config.php

यदि हम wget या कर्ल के साथ क्रोन कार्य सेट करते हैं तो हमारे पास PHP स्क्रिप्ट को निष्पादित करने के लिए 30 सेकंड का नियम है। यह ईमेल सूचनाओं के टन भेजने और अन्य सामान करने के लिए बहुत छोटा है (हो सकता है कि रिमोट एसएमटीपी सर्वर कनेक्शन धीमा हो, हो सकता है कि यह वास्तव में bbPress या कुछ भी ईमेल सूचनाओं का एक बड़ा समूह हो)।

शायद हम कुछ इस तरह का उपयोग कर सकते हैं?

php -q wp-cron.php

लेकिन यह केवल मल्टीसाइट में एक साइट पर क्रोन को चलाने के लिए है (प्रत्येक साइट के अलग-अलग MySQL टेबल में अपने क्रोन कार्य हैं)।

PS on wpmudev.org फोरम पर मुझे अजीब "समाधान" मिला, जो कर्ल का भी उपयोग करता है।

एक और PS WP CLI में भयानक wp cronकमांड हैं लेकिन यह केवल मैन्युअल रूप से क्रोन कार्यों को चलाने की अनुमति देता है (हां, हम --urlattr का उपयोग कर सकते हैं )। उदाहरण के लिए:

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

क्या आपने WP-CLIकोर कोड पर एक नज़र डाली है?
कैसर

हाँ। मैं अभी स्रोत कोड में खुदाई करता हूं और समझने की कोशिश करता हूं :) सभी कार्यों (घटनाओं) को चलाने के लिए आदेश मौजूद नहीं है, शायद मैं इसे भविष्य में बना सकता हूं।
कोल्या कोरोबोच्किन

क्या आपके पास wp/ WP-CLI है PATH? यदि हाँ, तो क्रॉन में चलने वाली बैश फ़ाइल से ट्रिगर क्यों नहीं?
kaiser

बहुत अच्छा लगता है! लेकिन wp cli से सभी cron टास्क कैसे चलाएं? मुझे इसके लिए कोई आदेश नहीं दिख रहा है।
कोल्या कोरोबोच्किन

जैसा कि आपने अपने प्रश्न के अंत में दिखाया है?
kaiser

जवाबों:


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 में जोड़ना होगा और यदि आप चाहें तो इसे हर मिनट में चलाना होगा


एचएम आपकी राय के लिए धन्यवाद, लेकिन मुझे लगता है कि यह हैकी (गंदा) समाधान है। मुझे लगता है कि wpcli के लिए कुछ PHP एडऑन लिखना बेहतर होगा जो सिर्फ सभी आवश्यक कार्यों को चलाते हैं। WP फ़ंक्शन और कोड को समझने के लिए मुझे और समय चाहिए।
कोया कोरोबोच्किन

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 के साथ हूं - वह वर्डप्रेस कमांड लाइन टूल का उपयोग करने के लिए कमांड लाइन का उपयोग कर रहा है। एक साफ बैश उदाहरण के लिए सहारा। आप इस उत्तर को क्रॉस्टैब प्रविष्टि दिखाकर दिखा सकते हैं।
जगप

भविष्य के पाठकों के लाभ के लिए, फिर स्क्रिप्ट इस तरह दिखती है: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सेटअप सही है, आप --pathकॉल करते समय झंडे को हटा सकते हैं cron run


wp cron event run --due-now

[<hook>…] एक या अधिक हुक चलाने के लिए।

[--due-now] अभी सभी हुक चलाएं।

[--all] सभी हुक चलाएं।


करने के लिए पूरे क्रॉन कार्य चलाने के क्रम में:

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;

यदि आप उन्हें समवर्ती रूप से चलाना चाहते हैं (पहले गैर-साइट-विशिष्ट क्रोन चलाना):

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

यदि आप क्रोन से एक कस्टम कमांड चलाना चाहते हैं , तो आपको काम करने के लिए 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

पीएचपी

एकमात्र कारण आपको यहां वर्डप्रेस को लोड करने की आवश्यकता होगी, पूर्व-परिभाषित सूची का उपयोग करने के बजाय डेटाबेस से URL को इकट्ठा करना है। हम केवल उन 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एक कॉन्टैब में अपने लिए एक ही कॉल जोड़ें

* * * * * 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="{}"

आप या तो इसे मैन्युअल रूप से चला सकते हैं या इसे एक स्क्रिप्ट में डाल सकते हैं और इसे क्रोन से अन्य उत्तरों के रूप में कॉल कर सकते हैं।


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

हम इसे क्रेस्टब से कहते हैं, आशा है कि यह मदद करता है


-5

मुझे लगता है कि आपको हमें यह बताने की जरूरत है कि "wp-cron.php को सही तरीके से चलाएं" सबसे पहले और सबसे महत्वपूर्ण है। Wordpress के अनुसार, इसका कोई मतलब नहीं है कि आप wp-cron को अक्षम कर दें और फिर भी इसे चलाना चाहते हैं ... Linux परिप्रेक्ष्य से, wget-ing या / bin / php-ing wp-cron.php सही होगा, लेकिन ऐसा लगता है कि आपका विशेष मेजबान सुरक्षा कारणों से आपके php चालान की संख्या को सीमित कर रहा है? - वह हिस्सा आपके विवरण से पूरी तरह से स्पष्ट नहीं है।

एक और सवाल: "एक टन" कितने ईमेल हैं? ऐसे कई कारण हैं कि आपको बहुत अधिक ईमेल भेजने की कोशिश नहीं करनी चाहिए।

आपको अपने उद्देश्यों पर फिर से विचार करना पड़ सकता है।

(मैं जवाब देने के बजाय टिप्पणी करूंगा लेकिन मेरे पास wpstack पर पर्याप्त प्रतिष्ठा नहीं है।)


3
वर्डप्रेस क्रोन चलाने के कई तरीके हैं। अंतर्निहित तंत्र को पृष्ठ दृश्य द्वारा ट्रिगर किया जाता है, और इसके DISABLE_WP_CRONबजाय अधिक विश्वसनीय सिस्टम क्रोन विधि सेट करते समय इस पद्धति को अक्षम करने के लिए सेट करना आम बात है ।
मार्कस डाउनिंग

सवाल यह नहीं है कि ऐसा क्यों किया जाए / यदि कारण सार्थक हैं लेकिन एक मल्टीसाइट इंस्टॉलेशन पर wp-cron.php को सही ढंग से कैसे कॉल करें। मेरे लिए काफी स्पष्ट;)
फिलिप

1
मुझे आशा है कि आपको एहसास होगा कि आप बहुत पुराने और पहले से छिपे हुए उत्तर पर टिप्पणी कर रहे हैं।
जॉर्ज ऑरपिनल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.