2016-11-11 6 views
11

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

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

  1. एक उपयोगकर्ता अपनी वेबसाइट पर रजिस्टर करने के लिए कोशिश करता है और एक ई-मेल/उसके कुछ ही देर में उसके पास भेजे जाने के लिए उम्मीद है। इस प्रकार, यदि ईमेल/मिनट कोटा पार हो गया है, तो मुझे एक अलग संदेश भेजने की आवश्यकता है: "हमारा सर्वर व्यस्त है, कृपया आवश्यक कार्य करने के लिए 'x' मिनटों को अनुमति दें"।
  2. ईमेल भेजने के अनुरोध सभी AJAX के माध्यम से किए जाते हैं। प्रक्रिया के भीतर 'नींद' का उपयोग करना एक विकल्प नहीं है क्योंकि उपयोगकर्ता को 'व्यस्त संदेश' echo'd होने तक x मिनट का इंतजार करना होगा।
  3. मैंने ob_flush, flush ... आदि के साथ प्रयास किया। संदेश को गूंजने के लिए संयोजन तब सर्वर पृष्ठभूमि में सब कुछ काम करता है, लेकिन यह कभी काम नहीं करता है। AJAX कॉल हमेशा स्क्रिप्ट के परिणाम को गूंजने के लिए समाप्त होने का इंतजार कर रहा था।
  4. मुझे एकल-थ्रेडेड PHP भाषा में बहु-थ्रेडिंग की आवश्यकता है! एक कामकाज के रूप में मैंने क्रॉन नौकरियों का उपयोग किया, जहां प्रत्येक ढेर ईमेल time() पर निष्पादित किया जाना निर्धारित है (यानी सीधे निर्धारित नौकरी को आग लगाना) जो ईमेल भेजता है उसी कार्य को लगाया जाता है। ध्वज का उपयोग करके, फ़ंक्शन जानता है कि अनुरोध एक ढेर ईमेल है और इसे ईमेल कोटा रीसेट के लिए आवश्यक समय तक 'नींद' बनाता है।

  5. समस्या: यदि 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 ईमेल भेजने के लिए कोशिश मैं डेटाबेस में क्या लॉग इन करने के है:

यहाँ कोड है कि ऊपर कार्यान्वित का हिस्सा है।

MYSQL database logs

सूचना है कि समय स्टाम्प प्रत्येक लॉग और निम्न में से एक है, हालांकि वे सभी एक ही समय में सक्रिय किया जाना चाहिए और 10 सेकंड के लिए प्रत्येक सोता के बीच 10 सेकंड के अंतर है तो सभी समानांतर में ईमेल भेजते हैं।

तो मेरा सवाल यह है: वर्डप्रेस क्रॉन अनुसूचित नौकरियों को अनुक्रमिक रूप से क्यों आग लगाता है और समानांतर में नहीं? और इस समस्या को दूर करने के लिए कैसे?

किसी भी मदद की बहुत सराहना की जाती है।

+0

शायद मैं एक वर्डप्रेस समस्या यह है कि मैं ऊपर कोड संयोजित करते समय का सामना करना पड़ा कहना चाहिए: जब आप एक वर्डप्रेस क्रॉन जॉब "नींद" मतलब है कि यह फिर से निष्पादित किया जाएगा जब भी किसी समय के दौरान आपकी वेबसाइट पर बनाने यह सोता है ... यानी यदि निर्धारित कार्य समाप्त नहीं हुआ है, तो WordPress फिर से इसे फिर से आग लग जाएगा क्योंकि यह अभी भी क्रॉन नौकरी देखता है। मुझे लगता है कि यह कुछ ऐसा है जो WordPress लोगों को ठीक करना चाहिए, कोई भी क्रॉन नौकरी को बहुत करीब अंतराल पर एक से अधिक बार निष्पादित करने की अपेक्षा नहीं करता है। –

+0

स्पष्ट रूप से उनकी वेबसाइट पर कौन सी वर्डप्रेस कहती है: "ध्यान दें कि एक ही नाम की मौजूदा घटना के 10 मिनट से पहले होने वाली घटना को शेड्यूल करना अनदेखा कर दिया जाएगा, जब तक कि आप प्रत्येक अनुसूचित घटना में $ Arg के लिए अद्वितीय मान पास न करें।" इसका अर्थ है कि वर्डप्रेस करता है 10 मिनट की अवधि के भीतर एक ही स्क्रिप्ट को "शेड्यूलिंग" की अनुमति न दें, जबकि इसे एक निश्चित समय अवधि के भीतर एक ही अनुसूचित स्क्रिप्ट को "निष्पादित" से भी रोकना चाहिए। –

+0

मैं पहले क्रॉन प्रबंधन प्लगइन स्थापित करने की अनुशंसा करता हूं ताकि आप आसानी से देख सकें कि कौन से और कौन से क्रॉन फायरिंग कर रहे हैं, या यहां अपना खुद का https://developer.wordpress.org/plugins/cron/simple-testing/ –

उत्तर

3

जैसा कि बताया गया है, एक क्रॉन प्लगइन स्थापित करने से आपके क्रॉन्स को प्रबंधित करने में मदद मिलेगी।

आपके प्रश्न का उत्तर करने के लिए, Wordpress एक "क्रॉन लॉक" defined('DOING_CRON') का उपयोग करता है और यह अस्थायी $lock = get_transient('doing_cron') सेट किए जाने पर spawn_cron विधि शुरू हो जाती है।

तो, यदि आपके पास wp-includes/cron.php पर एक नज़र डालें तो आप देखेंगे कि वर्डप्रेस क्रॉन डिफ़ॉल्ट रूप से एक साथ नहीं चलते हैं और हर 60 सेकंड में एक से अधिक बार नहीं चलेंगे।

// don't run if another process is currently running it or more than once every 60 sec. 
    if ($lock + WP_CRON_LOCK_TIMEOUT > $gmt_time) 
     return; 
+1

दिलचस्प! तो मूल रूप से यदि मैं cron.php कोड बदलता हूं, तो मुझे क्रॉन नौकरियों को एक साथ निकाल दिया जाना चाहिए। मैं एक क्रॉन प्रबंधन प्लगइन का उपयोग करता हूं, और यह दिखाता है कि सभी क्रॉन नौकरियां चल रही हैं (हालांकि केवल एक ही चल रहा है) –

+1

मुझे विश्वास है, मेरे प्रारंभिक विचार WP के मूल क्रॉन विधियों को क्लोन करना होगा और उन पर हैक करें :) –

0

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

+0

धन्यवाद बनाने के लिए देखें आपके उत्तर के लिए .... कोड में "2 ईमेल थ्रेसहोल्ड" सिर्फ एक उदाहरण है ... थ्रेसहोल्ड हर 5 मिनट में लगभग 20 ईमेल है .... हाँ, अन्य एसएमटीपी सर्वरों का उपयोग करना संभव है जो अनुमति देते हैं भेजे जाने वाले ईमेल की उच्च आवृत्ति ....लेकिन यह सिर्फ समस्या से परहेज कर रहा है ... मैं मुख्य रूप से यह जानना चाहता हूं कि वर्डप्रेस क्रॉन कैसे व्यवहार करता है और मैं एक अध्ययन मामले के रूप में ईमेल समस्या का उपयोग कर रहा हूं। –

+0

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

0

php के रूप में तो ऊपर से नीचे तक चलता है:

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


add_action('my_hourly_event', 'do_this_hourly'); 

function do_this_hourly() { 
    // do something every hour 
} 

इस समारोह do_this_hourly() अनुसूची के अनुसार चलाया जाएगा, लेकिन कोड आप लिखेंगे जो उस समारोह के अंदर केवल एक ही चलाएगा।

  1. , हमें ईमेल 5 व्यक्तियों के लिए भेजने का उदाहरण लेते हैं तो ई-मेल एक पाश में एक के बाद उन्हें एक के लिए भेजा जाएगा।
  2. टाइम-स्टाम्प आपके द्वारा उपयोग की जाने वाली सम्मिलित क्वेरी द्वारा दर्ज किया गया है, timestamp और mail sent time के बीच कोई कनेक्शन नहीं है, यह आपके टाइम लॉग के लिए बनाया गया है, ताकि आप जांच सकें।

निश्चित रूप से कुछ अंतर होगा I: ई 10 सेकंड, यह ईमेल कम करने और सम्मिलित क्वेरी को संसाधित करने के समय के आधार पर कम या अधिक हो सकता है।

प्रत्येक क्वेरी को निकाल दिया जाएगा और उस समय के अनुसार टाइमस्टैम्प डाला जाएगा (सर्वर समय)।

संबंधित मुद्दे