हर 5 मिनट में एक फ़ंक्शन कैसे चलाया जाता है?


15

मेरा हर 5 मिनट पर चलने का फंक्शन है। मैंने कोडेक्स से निम्नलिखित का उल्लेख किया है:

<?php wp_schedule_event(time(), 'hourly', 'my_schedule_hook', $args); ?> 

मैं इस समारोह को हर 5 मिनट में चलाना चाहता हूं, जब भी शुरू करना हो। मैं यह कैसे कर सकता हूं?

यह भी कहता है कि कोडेक्स का कहना है कि साइट पर आगंतुक आने पर क्रोन चलाया जाएगा। क्या क्रोन को केवल प्रति मिनट के अनुसार चलाने का कोई तरीका है और यात्रा की प्रतीक्षा नहीं कर रहा है?

मान लीजिए कि निम्नलिखित फ़ंक्शन को हर 5 मिनट में चलाया जाना चाहिए फिर मैं इसका उपयोग कैसे कर सकता हूं wp_schedule_event()या wp_cron?

function run_evry_five_minutes(){
    // codes go here
}

यदि आप इस तरह के एक छोटे अंतराल और सटीकता की जरूरत है, तो आप बेहतर लिनक्स क्रोन या 3 पार्टी क्रोन सेवाओं को
देखते हैं

साइट भारी ट्रैफ़िक को रोकती है .. इसलिए समय अंतराल पर विचार करने की आवश्यकता नहीं है .. सुनिश्चित करें कि यह हर 2 या 3 मिनट के लिए चालू हो जाएगा .. ग्राहक इसे करना पसंद करते हैंfunctions.php
मूर्ख कोडर

एक टाइमर के साथ सर्वर पर चलने के बिना कुछ php फ़ाइल को ट्रिगर करना संभव नहीं है।
एंड्रयू वेल्च

फ़ाइल? हम function.php में एक फंक्शन के बारे में बात कर रहे हैं
फुलिश कोडर

क्या आपको लगता है कि एक मुफ्त निगरानी सेवा सीआरओ को ट्रिगर करने वाले पिंग हो सकती है? newrelic.com/server-monitoring
jgraup

जवाबों:


28

आप cron_schedules के माध्यम से नया शेड्यूल समय बना सकते हैं:

function my_cron_schedules($schedules){
    if(!isset($schedules["5min"])){
        $schedules["5min"] = array(
            'interval' => 5*60,
            'display' => __('Once every 5 minutes'));
    }
    if(!isset($schedules["30min"])){
        $schedules["30min"] = array(
            'interval' => 30*60,
            'display' => __('Once every 30 minutes'));
    }
    return $schedules;
}
add_filter('cron_schedules','my_cron_schedules');

अब आप अपने कार्य को निर्धारित कर सकते हैं:

wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);

केवल इसे एक बार शेड्यूल करने के लिए, इसे फंक्शन में लपेटें और इसे चलाने से पहले जांचें:

$args = array(false);
function schedule_my_cron(){
    wp_schedule_event(time(), '5min', 'my_schedule_hook', $args);
}
if(!wp_next_scheduled('my_schedule_hook',$args)){
    add_action('init', 'schedule_my_cron');
}

$ Args पैरामीटर पर ध्यान दें! Wp_next_scheduled में $ args पैरामीटर निर्दिष्ट नहीं करते हुए, लेकिन wp_schedule_event के लिए $ args होने से, उसी इवेंट की लगभग अनंत संख्या शेड्यूल हो जाएगी (केवल एक के बजाय)।

अंत में, वास्तविक फ़ंक्शन बनाएं जिसे आप चलाना चाहते हैं:

function my_schedule_hook(){
    // codes go here
}

मुझे लगता है कि यह उल्लेख करना महत्वपूर्ण है कि wp-cron शेड्यूल की जाँच कर रहा है और हर बार एक पेज लोड होने के कारण नियत कार्य चल रहा है।

इसलिए, यदि आपके पास एक कम ट्रैफ़िक वेबसाइट है, जिसमें केवल 1 विज़िटर एक घंटा है, तो wp-cron केवल तभी चलेगा जब वह विज़िटर आपकी साइट (एक घंटे में एक बार) ब्राउज़ करता है। यदि आपके पास एक उच्च ट्रैफ़िक साइट है, जो हर सेकंड एक पृष्ठ का अनुरोध करने वाले आगंतुकों के साथ है, तो सर्वर पर अतिरिक्त भार पैदा करने वाले हर सेकंड wp-cron को ट्रिगर किया जाएगा।

समाधान यह है कि आप wp-cron को डीएक्टिवेट करें और एक वास्तविक क्रॉन जॉब के माध्यम से इसे ट्रिगर करें ताकि आपके द्वारा सबसे पहले दोहराए गए अनुसूचित wp-cron जॉब (आपके मामले में 5 मिनट) हो सके।

लुकास रोलफ समस्या की व्याख्या करता है और समाधान को विस्तार से बताता है।

एक विकल्प के रूप में, आप अपनी साइट को क्वेरी करने के लिए UptimeRobot जैसी मुफ्त 3 पार्टी सेवा का उपयोग कर सकते हैं (और wp-cron को ट्रिगर करें), यदि आप wp-cron को निष्क्रिय नहीं करना चाहते हैं और इसे असली cron जॉब के माध्यम से ट्रिगर करना चाहते हैं।


2

यदि आपकी साइट पर भारी ट्रैफ़िक आता है, तो आप set_transient()इसे (बहुत लगभग) हर 5 मिनट में चलाने के लिए उपयोग कर सकते हैं , जैसे:

function run_every_five_minutes() {
    // Could probably do with some logic here to stop it running if just after running.
    // codes go here
}

if ( ! get_transient( 'every_5_minutes' ) ) {
    set_transient( 'every_5_minutes', true, 5 * MINUTE_IN_SECONDS );
    run_every_five_minutes();

    // It's better use a hook to call a function in the plugin/theme
    //add_action( 'init', 'run_every_five_minutes' );
}

ठीक है, एर, हाँ! ...
बोंगर

हाँ।, यह काम नहीं कर रहा है .. मैं में कोड निम्नलिखित इस्तेमाल किया functions.phpजब पेज के लिए एक यात्रा कर, एक अद्यतन मेरी डेटाबेस में एक मेज पर किया जाएगा .. function run_evry_five_minutes() { $homepage = file_get_contents('link to visit'); echo $homepage; }। लेकिन DB तालिका 6 मिनट के बाद भी अपडेट नहीं की जाती है।
मुर्ख कोडर

पता नहीं क्यों यह आपके लिए काम नहीं कर रहा है, लेकिन वास्तव में इसके बारे में सोचकर get_transient()/ set_transient()बिना क्रोन सामान का उपयोग करने से बहुत अधिक समझ में आता है, बहुत सरल, जवाब अपडेट करेगा ...
12

@bonger wp_schedule_event () के लिए यह अच्छा विकल्प है?
मार्को कूंक

@ MarkoKunić ईमानदार होने के लिए नहीं जाना है, यह कोशिश नहीं की है ... यह केवल एक समाधान के रूप में पेश किया गया था, लेकिन अगर आप इसे आज़माते हैं तो हमें बताएं ...! (जोहानो फ़िएरा का जवाब अच्छा है। wordpress.stackexchange.com/a/216121/57034 )
बोंगर

2

आप इसे प्रत्येक प्लगइन कॉल के बजाय प्लगइन सक्रियण में ट्रिगर कर सकते हैं:

//Add a utility function to handle logs more nicely.
if ( ! function_exists('write_log')) {
    function write_log ( $log )  {
        if ( is_array( $log ) || is_object( $log ) ) {
            error_log( print_r( $log, true ) );
        } else {
            error_log( $log );
        }
    }
}

/**
 * Do not let plugin be accessed directly
 **/
if ( ! defined( 'ABSPATH' ) ) {
    write_log( "Plugin should not be accessed directly!" );
    exit; // Exit if accessed directly
}

/**
 * -----------------------------------------------------------------------------------------------------------
 * Do not forget to trigger a system call to wp-cron page at least each 30mn.
 * Otherwise we cannot be sure that trigger will be called.
 * -----------------------------------------------------------------------------------------------------------
 * Linux command:
 * crontab -e
 * 30 * * * * wget http://<url>/wp-cron.php
 */

/**
 * Add a custom schedule to wp.
 * @param $schedules array The  existing schedules
 *
 * @return mixed The existing + new schedules.
 */
function woocsp_schedules( $schedules ) {
    write_log("Creating custom schedule.");
    if ( ! isset( $schedules["10s"] ) ) {
        $schedules["10s"] = array(
            'interval' => 10,
            'display'  => __( 'Once every 10 seconds' )
        );
    }

    write_log("Custom schedule created.");
    return $schedules;
}

//Add cron schedules filter with upper defined schedule.
add_filter( 'cron_schedules', 'woocsp_schedules' );

//Custom function to be called on schedule triggered.
function scheduleTriggered() {
    write_log( "Scheduler triggered!" );
}
add_action( 'woocsp_cron_delivery', 'scheduleTriggered' );

// Register an activation hook to perform operation only on plugin activation
register_activation_hook(__FILE__, 'woocsp_activation');
function woocsp_activation() {
    write_log("Plugin activating.");

    //Trigger our method on our custom schedule event.
    if ( ! wp_get_schedule( 'woocsp_cron_delivery' ) ) {
        wp_schedule_event( time(), '10s', 'woocsp_cron_delivery' );
    }

    write_log("Plugin activated.");
}

// Deactivate scheduled events on plugin deactivation.
register_deactivation_hook(__FILE__, 'woocsp_deactivation');
function woocsp_deactivation() {
    write_log("Plugin deactivating.");

    //Remove our scheduled hook.
    wp_clear_scheduled_hook('woocsp_cron_delivery');

    write_log("Plugin deactivated.");
}

1

मुझे डर है कि किसी को आपकी साइट पर जाने के लिए प्रतीक्षा करने के अलावा जो एक फ़ंक्शन चलाता है, केवल अन्य विकल्प आपके सर्वर पर क्रोन जॉब सेट करने के लिए कुछ इस तरह का उपयोग कर रहा है /programming/878600/how -तो-बनाएँ-क्रोनजॉब-यूज़िंग-बैश या यदि आपके सर्वर पर एक cpanel स्टाइल इंटरफ़ेस है, तो कभी-कभी इसे सेट करने के लिए एक gui होता है।


हाँ,।, मैं समझता हूँ कि .. मेरे पास पहले से ही cPnael से निर्मित कुछ क्रोन हैं .. लेकिन अब मैं एक फ़ंक्शन चलाने का प्रयास कर रहा हूं functions.phpक्योंकि जब फ़ंक्शन एक में है pluginया functions.phpहम ग्राहकों को cpanel से क्रोन सेट करने के लिए नहीं कह सकते हैं अपने दम पर ..
मूर्ख कोडर

1

Cronjob समयबद्धक प्लगइन, आप अपनी साइट का दौरा करने के लिए होने के बिना किसी को भी मज़बूती से और समय पर लगातार कार्य चलाने की अनुमति देता आप सभी की जरूरत कम से कम 1 कार्रवाई और एक यूनिक्स Crontab अनुसूची है।

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


0

मेरे पास शेड्यूल फ़ंक्शन और पुनरावर्ती WP Ajax फ़ंक्शन का उपयोग करके एक संभावित समाधान है।

  1. फ़ंक्शन चलाने के लिए 60 मिनट का शेड्यूल ईवेंट बनाएं
  2. यह फ़ंक्शन अजाक्स के माध्यम से एक पुनरावर्ती फ़ंक्शन को ट्रिगर करेगा file_get_contents()
  3. अजाक्स फ़ंक्शन में डेटाबेस पर कुल संख्या 60 (घंटे के अंदर प्रत्येक मिनट के लिए) होगी।
  4. यह अजाक्स फ़ंक्शन आपके काउंटर की जाँच करेगा:

यदि काउंटर बराबर या 60 से अधिक है तो यह काउंटर को रीसेट कर देगा और अगले क्रोन जॉब का इंतजार करेगा।

यदि 5 के कई काउंटर (प्रत्येक 5 मिनट में) तो यह आपके वांछित कार्य को अंजाम देगा

और, स्थितियों के अलावा, यह 59 सेकंड के लिए सोएगा sleep(59);(यह मानते हुए कि आपका कार्य यह एक त्वरित है)। नींद के बाद, यह file_get_contents()फिर से उपयोग करके खुद को ट्रिगर करेगा ।

ध्यान देने योग्य महत्वपूर्ण बातें:

  1. प्रक्रिया को बाधित करने का एक तरीका बनाएँ (यानी DB पर मान की जाँच करें)
  2. एक ही समय में 2 प्रक्रियाओं को रोकने का एक तरीका बनाएं
  3. File_get_contents पर हेडर पर समय सीमा 2 या 3 सेकंड पर सेट करें, अन्यथा सर्वर में विभिन्न प्रक्रियाएं हो सकती हैं जो कुछ भी नहीं इंतजार कर रही हैं
  4. आप set_time_limit(90);नींद से पहले अपने फ़ंक्शन को तोड़ने के लिए सर्वर को रोकने की कोशिश करने के लिए उपयोग करना चाह सकते हैं

यह एक समाधान है, एक अच्छा नहीं है, और यह सर्वर द्वारा अवरुद्ध हो सकता है। बाहरी क्रोन का उपयोग करके आप एक साधारण फ़ंक्शन सेट कर सकते हैं और सर्वर प्रत्येक 5 मिनट में एक बार संसाधनों का उपयोग करेगा। इस समाधान का उपयोग करते हुए, सर्वर हर समय उस पर संसाधनों का उपयोग करेगा।


0

@ जोहानो का उत्तर सही ढंग से बताता है कि WP क्रोन नौकरी के लिए एक कस्टम अंतराल कैसे सेट करें। हालांकि, दूसरे सवाल का जवाब नहीं दिया गया है, जो हर मिनट एक क्रोन को चलाने के लिए है:

  1. फ़ाइल में wp-config.php, निम्न कोड जोड़ें:

    define('DISABLE_WP_CRON', true);
  2. क्रोन जॉब जोड़ें ( crontab -eयूनिक्स / लिनक्स पर):

    1 * * * * wget -q -O - http://example.com/wp-cron.php?doing_wp_cron

पहला भाग (चरण 1) वर्डप्रेस आंतरिक क्रोन नौकरी को निष्क्रिय कर देगा। दूसरा भाग (चरण 2) मैन्युअल रूप से वर्डप्रेस क्रोन नौकरी को हर मिनट चलाएगा।

@ जोहानो के जवाब के साथ (हर 5 मिनट में एक कार्य कैसे चलाना है) और मेरा (मैन्युअल रूप से क्रोन कैसे चलाना है), आपको अपने लक्ष्य को प्राप्त करने में सक्षम होना चाहिए।

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