हाँ यह संभव है...
और ईमानदार होने के लिए, ऐसा करना अक्सर महत्वपूर्ण होता है ... 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 का हिस्सा हैं।
- वे उपयोग करने में आसान और कुशल हैं।
- वे गतिरोध पैदा नहीं करेंगे। मान लीजिए कि मेरा क्रोन कार्य मारा जा सकता है (कुछ त्रुटि हो सकती है, या यह बहुत लंबा चलता है और मारा जाता है, और इसी तरह)। इस तरह के मामले में यह सेमाफोर को नष्ट नहीं करेगा, इसलिए भविष्य के सभी कार्य काम नहीं करेंगे। ट्रांसजेंडर्स का उपयोग करना इस समस्या को हल करता है, क्योंकि कुछ समय के बाद क्षणिक हटा दिया जाएगा।
और क्या होगा अगर कई अलग-अलग क्रियाएं करनी हैं?
तो चलिए बताते हैं कि कई अलग-अलग क्रोन कार्य हैं, जिन्हें कभी एक ही समय में नहीं चलाना चाहिए, लेकिन हम फिर भी चाहते हैं कि वे सभी चलें ...
यदि हम समाधान को सेमाफोर के साथ उपयोग करते हैं और इन सभी कार्यों के लिए केवल एक सेमाफोर का उपयोग करते हैं, तो उनमें से कुछ कभी नहीं चल सकते हैं। तो फिर क्या किया जाए?
ऐसे में आपको अपनी सोच बदलनी चाहिए। आपके पास कुछ स्वतंत्र कार्य नहीं हैं, लेकिन कार्यों की एक कतार है। इसलिए आपको इसे इस तरह से लागू करना चाहिए।
इसलिए:
- आप किसी प्रकार की कतार जोड़ते हैं (आप एक सरणी का उपयोग कर सकते हैं और इसे विकल्प के रूप में संग्रहीत कर सकते हैं, या एक कस्टम DB तालिका जोड़ सकते हैं)।
- कार्यों को कतार में जोड़ने के लिए आप वर्तमान में WP क्रोन प्रति घंटा की घटना का उपयोग करते हैं।
- आप दूसरे WP क्रोन कार्यों को जोड़ते हैं जो बहुत अधिक बार चलते हैं और यह कतार से एक-एक करके "खाती" है। इस "खाने वाले" कार्य को यह सुनिश्चित करने के लिए कि एक समय में केवल एक ही कार्य चलता है, अर्धचालक का उपयोग करना चाहिए।