यह कैसे सुनिश्चित करें कि एक समय में केवल एक wp_cron () चलता है?


9

मेरे पास wp_cron()निम्नलिखित कोड की तरह लगभग 20 कार्य हैं। लगभग सभी क्रोन प्रति घंटा चलते हैं; कुछ दैनिक हैं।

if ( ! wp_next_scheduled( 'my_task_hook' ) ) {
  wp_schedule_event( time(), 'hourly', 'my_task_hook' );
}

add_action( 'my_task_hook', 'my_task_function' );

function my_task_function() {
  //Complex Code
}

सर्वर के प्रदर्शन को बढ़ाने के लिए, और इसलिए होस्टिंग कंपनियों से सर्वर सीमा संदेश प्राप्त नहीं करने के लिए, मैं यह सुनिश्चित करना चाहता हूं कि एक निश्चित समय में केवल एक क्रोन चलता है ... क्या यह संभव है?


वर्तमान स्वीकृत उत्तर बहुत अच्छा है, लेकिन मेरे पास निम्नलिखित प्रश्न हैं, यही कारण है कि मैं इस प्रश्न के लिए एक इनाम शुरू करता हूं।

कृपया पहले दिए गए उत्तर को पढ़ें।

मान लें कि क्रोन 1 रन, मेरा क्रोन 2 का कोड नहीं चल रहा है क्योंकि अभी भी हम 5 मिनट के अंदर हैं या पहले क्रोन अभी भी चल रहे हैं, लेकिन क्रोन 2 के लिए दौड़ने के कारण wp_schedule_event( time(), 'hourly', 'my_task_hook' );मुझे लगता है कि वर्डप्रेस क्रोन 2 चलाता है ..... इसलिए मूल रूप से कोड cron2 कोड कभी नहीं चला ..... या मुझे कुछ गलत समझा है?


नहीं, आप इसे सही तरीके से समझते हैं। मैं आपकी समस्या के लिए कुछ समाधानों के साथ अपना उत्तर अपडेट करूंगा ...
19z में Krzysiek Dróżd

जवाबों:


10

हाँ यह संभव है...

और ईमानदार होने के लिए, ऐसा करना अक्सर महत्वपूर्ण होता है ... WP समयबद्धक कभी-कभी समस्याओं का कारण बनता है, जब क्रोन कार्य लंबे होते हैं ...

तो मैं इस समस्या को कैसे हल करूं?

मैं सेमाफोर को लागू करने के लिए ट्रांज़िशन एपीआई का उपयोग करता हूं ...

यहाँ कोड है:

if ( ! wp_next_scheduled( 'my_task_hook' ) ) {
  wp_schedule_event( time(), 'hourly', 'my_task_hook' );
}

add_action( 'my_task_hook', 'my_task_function' );

function my_task_function() {
  // if some other my_task is already running, stop
  if ( get_transient( 'my_task_function_semaphore' ) ) return;

  // set semaphore for 5 minutes
  set_transient( 'my_task_function_semaphore', true, 5*60 );

  // DO YOUR STUFF

  delete_transient( 'my_task_function_semaphore' );
}

मैं इस मामले में ग्राहकों का उपयोग क्यों करूं? चूंकि:

  • वे WP का हिस्सा हैं।
  • वे उपयोग करने में आसान और कुशल हैं।
  • वे गतिरोध पैदा नहीं करेंगे। मान लीजिए कि मेरा क्रोन कार्य मारा जा सकता है (कुछ त्रुटि हो सकती है, या यह बहुत लंबा चलता है और मारा जाता है, और इसी तरह)। इस तरह के मामले में यह सेमाफोर को नष्ट नहीं करेगा, इसलिए भविष्य के सभी कार्य काम नहीं करेंगे। ट्रांसजेंडर्स का उपयोग करना इस समस्या को हल करता है, क्योंकि कुछ समय के बाद क्षणिक हटा दिया जाएगा।

और क्या होगा अगर कई अलग-अलग क्रियाएं करनी हैं?

तो चलिए बताते हैं कि कई अलग-अलग क्रोन कार्य हैं, जिन्हें कभी एक ही समय में नहीं चलाना चाहिए, लेकिन हम फिर भी चाहते हैं कि वे सभी चलें ...

यदि हम समाधान को सेमाफोर के साथ उपयोग करते हैं और इन सभी कार्यों के लिए केवल एक सेमाफोर का उपयोग करते हैं, तो उनमें से कुछ कभी नहीं चल सकते हैं। तो फिर क्या किया जाए?

ऐसे में आपको अपनी सोच बदलनी चाहिए। आपके पास कुछ स्वतंत्र कार्य नहीं हैं, लेकिन कार्यों की एक कतार है। इसलिए आपको इसे इस तरह से लागू करना चाहिए।

इसलिए:

  1. आप किसी प्रकार की कतार जोड़ते हैं (आप एक सरणी का उपयोग कर सकते हैं और इसे विकल्प के रूप में संग्रहीत कर सकते हैं, या एक कस्टम DB तालिका जोड़ सकते हैं)।
  2. कार्यों को कतार में जोड़ने के लिए आप वर्तमान में WP क्रोन प्रति घंटा की घटना का उपयोग करते हैं।
  3. आप दूसरे WP क्रोन कार्यों को जोड़ते हैं जो बहुत अधिक बार चलते हैं और यह कतार से एक-एक करके "खाती" है। इस "खाने वाले" कार्य को यह सुनिश्चित करने के लिए कि एक समय में केवल एक ही कार्य चलता है, अर्धचालक का उपयोग करना चाहिए।

धन्यवाद, लेकिन मुझे खेद है, मैंने पहले कभी क्षणिक उपयोग नहीं किया ... लेकिन मैं कोड को समझने के लिए ट्रिंग कर रहा हूं। आपने क्षणिक के लिए 5 मिनट क्यों निर्धारित किए क्योंकि आप क्षणिक का उपयोग करके हटाते हैं delete_transient()। तो वह समय मायने रखता है? मेरा मतलब है कि आप जो भी समय लगाते हैं set_transient, वह मेरे काम पूरा होने के तुरंत बाद हटा दिया जाता है ... तो एक समय क्यों है?
मैं

क्योंकि कुछ त्रुटियां हो सकती हैं। आखिरी बुलेट प्वाइंट पर एक नजर।
Krzysiek Dróżdż

धन्यवाद, बहुत अच्छा ... बस एक सवाल। जैसा कि मैं समझता हूं, यदि मैं my_task_function_semaphoreक्षणिक के लिए नाम के रूप में उपयोग करता हूं, तो मुझे अन्य सभी क्रोनों को एक ही नाम का उपयोग करना चाहिए?
मैं

@IamtheMostStupidPerson यह आप क्या हासिल करना ... तो केवल एक ही कार्य भी क्षण में काम करना चाहिए चाहते हैं पर निर्भर करता है, तो हाँ - सभी कार्य सेमाफोर के रूप में ही क्षणिक नाम का उपयोग करना चाहिए
Krzysiek Dróżdż

1
मैंने जॉब क्यू टूल्स जैसे गियरमैन के साथ समान काम किया है। यह कार्यान्वयन मदद कर सकता है: github.com/10up/WP-Minions
फ़याज़
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.