मैं होस्टिंग सेवा ईमेल सीमाओं का सामना करने के लिए अपनी वेबसाइट से भेजे गए ईमेल की संख्या को सीमित करने की कोशिश कर रहा हूं। मैं क्रॉन जॉब्स का उपयोग कर रहा हूं और डेटाबेस में ईमेल को पिल करने का संकेतक यह जांचने के लिए हूं कि भेजे गए ईमेल की संख्या कितनी ईमेल भेजे गए ईमेल की सीमा तक पहुंच रही है या नहीं।वर्डप्रेस क्रॉन नौकरियां अनुक्रमिक रूप से या समांतर में निष्पादित हैं?
जिस तरह से मैं इसे करता हूं, सीधे निर्धारित प्रक्रिया को निष्पादित कर रहा है, फिर इसे एक निश्चित अवधि (कतार में अपनी स्थिति के अनुसार) के लिए 'नींद' बना देता है और फिर ईमेल भेजता है और डेटाबेस में लॉग इन करता है। आगे कारण है कि मैं अनुसूचित कार्यों और 'नींद' का उपयोग कर रहा व्याख्या करने के लिए, पर विचार परिदृश्य नीचे:
- एक उपयोगकर्ता अपनी वेबसाइट पर रजिस्टर करने के लिए कोशिश करता है और एक ई-मेल/उसके कुछ ही देर में उसके पास भेजे जाने के लिए उम्मीद है। इस प्रकार, यदि ईमेल/मिनट कोटा पार हो गया है, तो मुझे एक अलग संदेश भेजने की आवश्यकता है: "हमारा सर्वर व्यस्त है, कृपया आवश्यक कार्य करने के लिए 'x' मिनटों को अनुमति दें"।
- ईमेल भेजने के अनुरोध सभी AJAX के माध्यम से किए जाते हैं। प्रक्रिया के भीतर 'नींद' का उपयोग करना एक विकल्प नहीं है क्योंकि उपयोगकर्ता को 'व्यस्त संदेश' echo'd होने तक x मिनट का इंतजार करना होगा।
- मैंने ob_flush, flush ... आदि के साथ प्रयास किया। संदेश को गूंजने के लिए संयोजन तब सर्वर पृष्ठभूमि में सब कुछ काम करता है, लेकिन यह कभी काम नहीं करता है। AJAX कॉल हमेशा स्क्रिप्ट के परिणाम को गूंजने के लिए समाप्त होने का इंतजार कर रहा था।
मुझे एकल-थ्रेडेड PHP भाषा में बहु-थ्रेडिंग की आवश्यकता है! एक कामकाज के रूप में मैंने क्रॉन नौकरियों का उपयोग किया, जहां प्रत्येक ढेर ईमेल
time()
पर निष्पादित किया जाना निर्धारित है (यानी सीधे निर्धारित नौकरी को आग लगाना) जो ईमेल भेजता है उसी कार्य को लगाया जाता है। ध्वज का उपयोग करके, फ़ंक्शन जानता है कि अनुरोध एक ढेर ईमेल है और इसे ईमेल कोटा रीसेट के लिए आवश्यक समय तक 'नींद' बनाता है।समस्या: यदि 5 लोग लगभग एक ही समय में पंजीकृत होते हैं (जबकि हमारे पास अभी भी एक ईमेल ढेर है), तो हमारे पास 5 क्रॉन नौकरियां हैं जिन्हें सभी को एक ही समय में निष्पादित किया जाना चाहिए और फिर थोड़ी देर के लिए सोना चाहिए (नींद का समय भिन्न हो सकता है यदि ढेर में ईमेल की संख्या पहले से ही ईमेल कोटा से अधिक है), तो ईमेल भेजे जाते हैं। हालांकि, जब मैं डेटाबेस में लॉग की जांच करता हूं, तो मुझे लगता है कि अनुसूचित नौकरियां अनुक्रमिक रूप से निष्पादित की जाती हैं और समानांतर में नहीं। कभी-कभी ऐसा होता है कि दूसरे सिरों से पहले एक क्रॉन नौकरी निकाल दी जाती है, लेकिन वे एक ही समय में आग नहीं लगती हैं।
मुझे पता है कि वर्डप्रेस क्रॉन नौकरियों वास्तव में क्रॉन नौकरियों नहीं हैं और निकाल दिया जाता है एक बार किसी वेबसाइट पर जाता है (और मुझे यकीन है कि मैं ताज़ा पंजीकरण अनुरोध के बाद पृष्ठों अनुसूचित कार्यों के सभी आग ही भेजे गए हैं), लेकिन वे मेरे लिए एकमात्र विकल्प प्रतीत होते हैं क्योंकि मेरा होस्टिंग सर्वर सर्वर तक पहुंच की अनुमति नहीं देता है और न ही क्रॉन नौकरियों को शेड्यूल करने की अनुमति देता है।
//Test example to pile up emails, where quota is set to 2 emails every 30 seconds
$Emails_Threshold = 2;
$Threshold_Duration = 0.5*60;
//Get email indicator info
$Email_Info = $wpdb->get_row(
"SELECT *
FROM PileEmails
WHERE priority = -1
AND Status='New';"
,ARRAY_A);
if ($sleep ==0 && $Queue_Info_id==0){ //Not a scheduled event
//Check if there are queued emails
$Queue_exist = $wpdb->get_row (
$wpdb->prepare("
SELECT Status
FROM PileEmails
WHERE Status='Queued';"
,$mail_priority)
,ARRAY_A);
if (!empty($Queue_exist) || ($Email_Info['last_email_time'] > (time()-$Threshold_Duration))){
if ($Email_Info['count_emails']>=$Emails_Threshold){
//Code to Pile up
}
}else{
//Reset email counter
}
}else{
$wpdb->insert("PileEmails",$Sleep_Info,$format);
sleep(10); //10 seconds here just as an example
}
//Code to send emails
यहाँ जब मैं कोटा पार करने के बाद 10 ईमेल भेजने के लिए कोशिश मैं डेटाबेस में क्या लॉग इन करने के है:
यहाँ कोड है कि ऊपर कार्यान्वित का हिस्सा है।
सूचना है कि समय स्टाम्प प्रत्येक लॉग और निम्न में से एक है, हालांकि वे सभी एक ही समय में सक्रिय किया जाना चाहिए और 10 सेकंड के लिए प्रत्येक सोता के बीच 10 सेकंड के अंतर है तो सभी समानांतर में ईमेल भेजते हैं।
तो मेरा सवाल यह है: वर्डप्रेस क्रॉन अनुसूचित नौकरियों को अनुक्रमिक रूप से क्यों आग लगाता है और समानांतर में नहीं? और इस समस्या को दूर करने के लिए कैसे?
किसी भी मदद की बहुत सराहना की जाती है।
शायद मैं एक वर्डप्रेस समस्या यह है कि मैं ऊपर कोड संयोजित करते समय का सामना करना पड़ा कहना चाहिए: जब आप एक वर्डप्रेस क्रॉन जॉब "नींद" मतलब है कि यह फिर से निष्पादित किया जाएगा जब भी किसी समय के दौरान आपकी वेबसाइट पर बनाने यह सोता है ... यानी यदि निर्धारित कार्य समाप्त नहीं हुआ है, तो WordPress फिर से इसे फिर से आग लग जाएगा क्योंकि यह अभी भी क्रॉन नौकरी देखता है। मुझे लगता है कि यह कुछ ऐसा है जो WordPress लोगों को ठीक करना चाहिए, कोई भी क्रॉन नौकरी को बहुत करीब अंतराल पर एक से अधिक बार निष्पादित करने की अपेक्षा नहीं करता है। –
स्पष्ट रूप से उनकी वेबसाइट पर कौन सी वर्डप्रेस कहती है: "ध्यान दें कि एक ही नाम की मौजूदा घटना के 10 मिनट से पहले होने वाली घटना को शेड्यूल करना अनदेखा कर दिया जाएगा, जब तक कि आप प्रत्येक अनुसूचित घटना में $ Arg के लिए अद्वितीय मान पास न करें।" इसका अर्थ है कि वर्डप्रेस करता है 10 मिनट की अवधि के भीतर एक ही स्क्रिप्ट को "शेड्यूलिंग" की अनुमति न दें, जबकि इसे एक निश्चित समय अवधि के भीतर एक ही अनुसूचित स्क्रिप्ट को "निष्पादित" से भी रोकना चाहिए। –
मैं पहले क्रॉन प्रबंधन प्लगइन स्थापित करने की अनुशंसा करता हूं ताकि आप आसानी से देख सकें कि कौन से और कौन से क्रॉन फायरिंग कर रहे हैं, या यहां अपना खुद का https://developer.wordpress.org/plugins/cron/simple-testing/ –