जब समय बीत जाता है तो WP Cron निष्पादित नहीं करता है


16

लक्ष्य

मैं wp_schedule_single_event( )किसी एक ईवेंट को निष्पादित करने के लिए उपयोग करना चाहता हूं जो मुझे उपयोगकर्ता को एक फॉर्म सबमिट करने के 8 मिनट बाद ई-मेल भेजता है।

समस्या

निम्नलिखित कोड मेरे में है functions.php:

function nkapi_send_to_system( $args ) {
  wp_mail( 'xxx', 'xxx', $args );
}

add_action( 'nkapi_send', 'nkapi_send_to_system' );

function schedule_event( $id ) {
  wp_schedule_single_event( current_time( 'timestamp' ) + 480, 'nkapi_send', array( $id ) );
}

और कॉल करने के लिए निम्न कोड का उपयोग किया जाता है schedule-event:

schedule_event( $_SESSION['insert_id'] ); // the $_SESSION var contains an INT

8 मिनट से अधिक प्रतीक्षा करने के बाद मेरे इनबॉक्स में कोई ई-मेल नहीं था।

मैंने क्या कोशिश की

प्लगइन कोर नियंत्रण के साथ यह देखना संभव है कि विच क्रोन जॉब्स शेड्यूल किए गए हैं।

कोर कंट्रोल स्क्रीन

कुछ बदलावों के बाद, मैं उन्हें काफी सही और बेहतर बनाने में कामयाब रहा, जब मैंने "रन नाउ" को हिट किया, तो मुझे वास्तव में मेरे इनबॉक्स में एक ई-मेल मिला।

लेकिन जब मैं अपनी साइट पर 8 मिनट के बाद जाता हूं तो क्रोन का निष्पादन क्यों नहीं होता है। संभवतः इस कोड में क्या गलत है? मुझे यह कहना है कि WP Cron का उपयोग करते हुए यह मेरा पहला अवसर है।

मैंने और कोशिश की

Vancoder id की टिप्पणी के बाद परीक्षण करने का निर्णय लिया गया कि क्या कोड काम करता है अगर मैं निम्नलिखित कोड सीधे इसमें डालूंfunctions.php :

function schedule_event( $id ) {
  wp_schedule_single_event( time(), 'nkapi_send', array( $id ) );
}

if ( isset( $_SESSION['insert_id'] ) ) {
  if ( ! array_key_exists( 'insert_scheduled', $_SESSION ) || $_SESSION['insert_scheduled'] != $_SESSION['insert_id'] ) {
    schedule_event( $_SESSION['insert_id'] );
    $_SESSION['insert_scheduled'] = $_SESSION['insert_id'];
  }
}

इस कोड का नकारात्मक पहलू यह है कि उपयोगकर्ता को इस कोड को निष्पादित करने से पहले किसी अन्य पृष्ठ पर जाना होगा। लेकिन दूसरी तरफ, यह या तो काम नहीं करता है ताकि मेरा पहला मुद्दा न हो ...


1
कहां और कैसे schedule_event( $_SESSION['insert_id'] );फायर किया जाता है?
vancoder

एक शोर्ट में एक पेज में एक अलग फाइल (इसमें एक फॉर्म के साथ) शामिल होता है, जब उस फॉर्म को पेज रीलोड्स पोस्ट किया जाता है, उसी फाइल को तब निष्पादित किया जाता है schedule_event( ), जो शोर्टकोड द्वारा लोड की गई शामिल फाइल के ऊपर कहता है।
माइक मैडर्न

क्या कोई क्रोन काम करता है? wp_version_check आदि?
vancoder

मुझे काम करने के लिए कोई क्रोन नहीं मिला । उस की समस्या क्या हो सकती है?
माइक मैडर्न

पुष्टि करने के लिए - यहां तक ​​कि कोर क्रोन नौकरियां भी विफल हो जाती हैं?
vancoder

जवाबों:


8

पहले आप कृपया पुष्टि कर सकते हैं कि आपके पास कोई कैशिंग प्लग इन सक्षम नहीं है? कैशिंग प्लगइन्स क्रोन नौकरियों में हस्तक्षेप कर सकते हैं क्योंकि आपके आगंतुकों को एक लाइव पेज नहीं बल्कि आपके पेज का कैश्ड संस्करण परोसा जाता है।

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

फिर आपको मैन्युअल रूप से क्रोन जॉब (यदि आप एक साझा होस्टिंग वातावरण पर हैं या टर्मिनल से वीपीएस / डेडिकेटेड सर्वर है तो) उस पेज को हर कुछ मिनट में विजिट करेंगे।

मुझे आशा है कि वह मदद करेंगे!


मेरे पास एक कैशिंग प्लगइन सक्षम है! W3 कुल कैश सटीक होने के लिए
माइक मैडर्न

14

सबसे पहले, अपने कस्टम क्रोन जॉब शेड्यूल को परिभाषित करें।

add_filter('cron_schedules', array($this, 'cron_schedules'));

public function cron_schedules($schedules){
    $prefix = 'cron_';// Avoid conflict with other crons. Example Reference: cron_30_mins
    $schedule_options = array(
        '30_mins' => array(
            'display' => '30 Minutes',
            'interval' => '1800'
        ),
        '1_hours' => array(
            'display' => 'Hour',
            'interval' => '3600'
        ),
        '2_hours' => array(
            'display' => '2 Hours',
            'interval' => '7200'
        )
    );
    /* Add each custom schedule into the cron job system. */
    foreach($schedule_options as $schedule_key => $schedule){
        $schedules[$prefix.$schedule_key] = array(
            'interval' => $schedule['interval'],
            'display' => __('Every '.$schedule['display'])
        );
     }
     return $schedules;
}

आपको यह तय करने की आवश्यकता है कि घटना को वास्तव में कहां और कब निर्धारित किया जाए।

यहां कोड का केवल एक उदाहरण स्निपेट है, जो एक कस्टम क्लास विधि को कॉल करता है:

$schedule = $this->schedule_task(array(
    'timestamp' => current_time('timestamp'), // Determine when to schedule the task.
    'recurrence' => 'cron_30_mins',// Pick one of the schedules set earlier.
    'hook' => 'custom_imap_import'// Set the name of your cron task.
));

यहाँ कोड है जो वास्तव में घटना को निर्धारित करता है:

private function schedule_task($task){
    /* Must have task information. */
    if(!$task){
        return false;
    }
    /* Set list of required task keys. */
    $required_keys = array(
        'timestamp',
        'recurrence',
        'hook'
    );
    /* Verify the necessary task information exists. */
    $missing_keys = array();
    foreach($required_keys as $key){
        if(!array_key_exists($key, $task)){
            $missing_keys[] = $key;
        }
    }
    /* Check for missing keys. */
    if(!empty($missing_keys)){
        return false;
    }
    /* Task must not already be scheduled. */
    if(wp_next_scheduled($task['hook'])){
        wp_clear_scheduled_hook($task['hook']);
    }
    /* Schedule the task to run. */
    wp_schedule_event($task['timestamp'], $task['recurrence'], $task['hook']);
    return true;
}

अब, आपको केवल अपने कस्टम क्रोन कार्य के नाम पर कॉल करना है। इस उदाहरण में क्रोन कार्य नाम है custom_imap_import

add_action('custom_imap_import', array($this, 'do_imap_import'));

public function do_imap_import(){
    // .... Do stuff when cron is fired ....
}

इसलिए इस उदाहरण में, $this->do_imap_import();हर 30 मिनट में कहा जाता है (यह मानते हुए कि आपकी वेबसाइट पर पर्याप्त ट्रैफ़िक है)।


टिप्पणियाँ

अपने क्रोन को सही समय पर फायर करने के लिए पेज विजिट की आवश्यकता होती है।

उदाहरण: यदि आपने 30 मिनट के अंतराल पर एक कार्य निर्धारित किया है, लेकिन कोई भी आपकी साइट पर 4 घंटे तक नहीं जाता है, तो आपकी क्रोन नौकरी को तब तक निकाल नहीं दिया जाएगा जब तक कि आगंतुक आपकी साइट पर 4 घंटे बाद नहीं आता। यदि आपको वास्तव में हर 30 मिनट में अपने काम की आवश्यकता होती है, तो यह आपके वेब होस्टिंग प्रदाता के माध्यम से वांछित अंतराल पर अपनी वेबसाइट पर जाने के लिए एक वैध क्रोन नौकरी सेटअप करने की सलाह दी जाती है।

वर्डप्रेस क्रॉन जॉब्स आपकी वेबसाइट को धीमा नहीं बनाते हैं!

हो सकता है कि आप सोच रहे हों कि अगर क्रोन-स्क्रिप्ट को निष्पादित होने में लंबा समय लगता है, तो क्या आगंतुकों को स्क्रिप्ट निष्पादित होने तक इंतजार करना होगा। नहीं! वह कैसे संभव हो सकता है? अगर आप wp-cron.phpफाइल देखेंगे तो आपको एक लाइन मिलेगी

ignore_user_abort(true);

यह है php.ini कॉन्फ़िगरेशन है जो सेट करता है कि यदि आप साइट / स्क्रिप्ट को लोड करना बंद कर देते हैं तो स्क्रिप्ट निष्पादित करना बंद नहीं करेगी।

यदि आप wp-includes/cron.phpफ़ाइल को देखते हैं तो आपको इस तरह की एक लाइन मिलेगी:

wp_remote_post( $cron_url, 
array('timeout' => 0.01,
 'blocking' => false, 
 'sslverify' => apply_filters('https_local_ssl_verify', true)) );

मतलब यह है कि वर्डप्रेस निष्पादन ट्रिगर तो यह रद्द कर देगा, लेकिन जैसा कि आप निर्धारित किया है के लिए केवल 0.01 सेकंड इंतजार करेंगे ignore_user_abortकरने के लिए trueस्क्रिप्ट पर कार्य किया जाएगा। यह कार्यक्षमता वर्डप्रेस क्रोन नौकरियों में बड़ी स्क्रिप्ट को निष्पादित करने के लिए एक बड़ा लाभ है।

सहायता के लिए उपलब्ध कार्य:


6
यह एक उल्लेखनीय व्यापक प्रतिक्रिया है, जो कि जहां तक ​​मैं देख सकता हूं, वास्तविक प्रश्न को संबोधित करने में विफल रहता है - यही कारण है कि सभी निर्धारित कार्य (कोर कार्यों सहित) विफल होते हैं।
vancoder

यह उत्तर उपयोगकर्ता को वर्डप्रेस क्रोन कार्यों को सही ढंग से समझने और शेड्यूल करने के लिए सही दिशा में मार्गदर्शन करने के लिए है।
माइकल Ecklund

4
इस यकीन ने मुझे वर्डप्रेस के साथ क्रोन शेड्यूल समझने में बहुत मदद की
माइक मैडर्न

2
माइकल, आपको अधिक बार जवाब देना चाहिए। महान एक +1
केसर

1
मुझे लगता है कि WP_Cronजीएमटी हुड के तहत, बाकी WP की तरह उपयोग करता है, इसलिए इसके time()बजाय पहली घटना को शेड्यूल करना बेहतर होगा current_time()
इयान डन

3

वर्डप्रेस क्रोन आपको कार्यों को शेड्यूल करने की अनुमति देता है, लेकिन वे केवल तभी निष्पादित करेंगे जब साइट पर अनुरोध किया गया हो। प्रत्येक अनुरोध के लिए जो वर्डप्रेस को प्राप्त होता है, यह देखने के लिए जांच करेगा कि क्या क्रोन नौकरियों को संसाधित करने के लिए हैं, और यदि ऐसा करने के लिए अनुरोध बंद हो जाता है/wp-cron.php?doing_wp_cron एसिंक्रोनस रूप से । यदि किसी कार्य का निर्धारित समय बिना किसी अनुरोध के गुजरता है, तो क्रोन प्रक्रिया शुरू नहीं की जाएगी।

चूंकि आप अपनी निर्धारित नौकरियों को देखने और चलाने में सक्षम हैं, इसलिए यह संभव है कि कोई अनुरोध नहीं हैं जो शुरू करने के लिए क्रोन नौकरी को ट्रिगर करते हैं, खासकर यदि आप कैशिंग प्लगइन का उपयोग कर रहे हैं। इसे और अधिक नियमित शेड्यूल में उतारने का सबसे अच्छा विकल्प वर्डप्रेस और उपयोग में डिफ़ॉल्ट चेक को अक्षम करना है crontab

डिफ़ॉल्ट चेक को अक्षम करने के लिए सबसे पहले (जो क्लाइंट साइड प्रदर्शन के साथ थोड़ी मदद कर सकता है), निम्नलिखित को जोड़ें wp-config.php:

// Disable default check for WordPress cron jobs on page loads
define( 'DISABLE_WP_CRON', true );

इसके बाद आप wp-cron.phpकमांड लाइन में प्रवेश करने से लेकर पीछे के छोर पर किसी भी कार्य को संसाधित करने के लिए एक मिनट में एक बार पृष्ठ लाने के लिए एक कार्य बनाते हैं , crontab -eऔर फिर निम्न की तरह दिखने वाली एक पंक्ति जोड़ते हैं:

*/1 * * * * /usr/bin/curl --silent http://example.com/wp-cron.php?doing_wp_cron=$(date +\%s.\%N) >/dev/null 

2
यदि आप do_wp_cron को कोई मूल्य नहीं देते हैं, तो इससे कई बार नौकरियों के दो बार निष्पादित होने की संभावना होती है। doing_wp_cron=$(date +\%s.\%N)रोकने के लिए उपयोग करें ।
अलेक्जेंडर गार्डन

0

जांचें कि DISABLE_WP_CRON आपके कॉन्फ़िगरेशन में सेट नहीं है।

असफल होना, सभी प्लगइन्स को अक्षम करने का प्रयास करें (कोर नियंत्रण को छोड़कर - हालांकि मैं wp-crontrol का उपयोग करूँगा) और देखें कि क्या आपकी मुख्य नौकरियां काम करती हैं। यदि वे करते हैं, तो आप कहीं न कहीं प्लगइन हस्तक्षेप का अनुभव कर रहे हैं।

इसी तरह, एक मानक ट्वेंटीसोमिंग थीम पर स्विच करने का प्रयास करें।

यदि इनमें से कोई भी फर्क नहीं पड़ता है, तो संभावना है कि यह एक होस्टिंग मुद्दा है।


मेरे पास DISABLE_WP_CRONसेट नहीं है wp-config.php, मैं और अधिक चीजों की कोशिश करूंगा और बाद में वापस
आऊंगा

0

Wordpress को छुपाने वाले किसी भी प्लगइन की जाँच करें।

अगर यह समस्या है तो कैसे देखें?

  1. Http (s) पर नेविगेट करें: //yoursite.com/wp-cron.php आपको एक खाली पृष्ठ देखना चाहिए। एक पूरी तरह से खाली।
  2. इसके अलावा आप एक क्रोन जॉब मैनेजर को "नेक्स्ट एक्जीक्यूशन" के तहत एक बार अवश्य देखें: क्रॉन जॉब शेड्यूल - अगर wp-cron.php ठीक से काम करता है (केवल पाठ "इन क्यू" - लेकिन एक निश्चित समय - कुछ प्रविष्टियों के लिए "इन क्यू" कभी-कभी ठीक है, लेकिन अगर यह एकमात्र चीज है आप देखते हैं -> आपका क्रोन काम नहीं करता है।)

+1। किसी भी प्लगइन्स पर विश्वास न करें कि "जाँच करें कि क्या क्रोन काम कर रहा है" - उदाहरण के लिए WP Cron स्टेटस चेकर प्लगइन ने दिखाया है कि क्रॉन काम कर रहा है। लेकिन वास्तव में ऐसा नहीं था। जो कुछ भी यह दिखाता है - अपनी आंखों पर विश्वास करें और इस प्लगइन को नहीं!

निष्कर्ष: यदि यह 404 त्रुटि है - तो स्विच ऑफ करें) न केवल कैशिंग प्लगइन्स, जैसा कि अन्य लोग बी का सुझाव देते हैं) लेकिन साथ ही किसी भी प्लगइन्स जो वर्डप्रेस को छिपाते हैं।

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