2011-06-08 19 views
5

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

यहाँ कुछ संभव समाधान मैं ले कर आए हैं कर रहे हैं:

  1. एक cronjob आग हर मिनट है। स्क्रिप्ट जो आग लगती है यह देखने के लिए डेटाबेस भेजती है कि भेजने के लिए कोई ईमेल है या नहीं, अगर वहां है, तो यह उन्हें वापस भेजता है, अन्यथा यह सो जाता है। इसके साथ दोष यह है कि हर मिनट कुछ ओवरहेड होता है। साथ ही, यह एक स्केलेबल सिस्टम नहीं हो सकता है, खासकर जब उपयोगकर्ताओं की संख्या इतनी बड़ी हो जाती है कि सभी ईमेल भेजने में एक मिनट लग सकते हैं।

  2. # 1 के समान, लेकिन नौकरी केवल हर 15 मिनट में आग लगती है। यह थोड़ा अधिक प्रबंधनीय है, लेकिन सही नहीं है, क्योंकि यह उपयोगकर्ताओं को 15 मिनट के अंक पर अनुस्मारक को प्रतिबंधित करता है, और जब भी कोई ईमेल भेजने के लिए नहीं होता है तब भी यह थोड़ा अधिक ओवरहेड होता है। बुरा नहीं है, लेकिन सही नहीं है।

  3. PHP निष्पादन() कुछ कोड है जो गतिशील रूप से क्रोंटैब को बदलता है या अंतर्निहित लिनक्स में "एट" नौकरी निर्धारित करता है। यह मुझे लचीलापन और "इंटरप्ट" प्रकार मॉडल प्रदान करेगा जो मैं चाहता हूं, लेकिन PHP को निष्पादित करने की अनुमति देने में एक बड़ा सुरक्षा छेद खोल देगा() लिनक्स कोड। तो, मैं आगे बढ़ने जा रहा हूं और इस पर शासन कर रहा हूं।

तो, मैं जो कुछ भी आया हूं उससे बेहतर कुछ भी? शायद क्रॉन का उपयोग किए बिना ईमेल शेड्यूल करने का एक तरीका? मैं यह देखने के लिए बहुत उत्सुक हूं कि आपको इस बारे में क्या कहना है :)।

+1

यहां तक ​​कि पोस्टफिक्स डेवलपर मेल शेड्यूलिंग के लिए क्रॉन नौकरियों का उपयोग करने की सलाह देते हैं। बीटीडब्ल्यू, ध्यान से 'exec' का उपयोग करने में कुछ भी गलत नहीं है। आपके कोड में कहीं और मेहनती खोल टिप्पणियों के कारण PHP बफर ओवरफ़्लो के कारण एक्सप्लॉइट अधिक संभावना है। – mario

+0

http://stackoverflow.com/questions/6278940/scheduling-a-regular-event-cron-cron-alternatives-cluding-celery। इस सवाल के समान दिखता है, नहीं? – Kizz

उत्तर

2

पहले संस्करण का उपयोग करें।

यह, सभी ईमेल

  1. चेक भेजने के लिए एक मिनट से अधिक समय लग सकता है file_exists ('mailing.q') है; यदि अभी भी मौजूद है - निष्पादन समाप्त करें।
  2. फ़ाइल mailing.q
  3. बनाएं ईमेल भेजने
  4. अनलिंक ('मेलिंग।क्ष ');

और भूमि के ऊपर के बारे में सोचना नहीं है - नहीं इस मामले में।

0

एक आदेश hostman है जो आपको एक निश्चित समय पर एक समारोह को कॉल करने की अनुमति देता है। ऐसा करना चाहिए जो आप चाहते हैं।

क्या एक संयोजन के बारे में:


यह मेरा मूल सुझाव था?

  1. < timespan> एक बार क्रॉन नौकरी चलाएं।
  2. क्या यह एक टाइमस्टैम्प => सूची के साथ फ़ाइल को पॉप्युलेट करता है यह दर्शाता है कि < वर्तमान समय> + < timespan> से पहले कोई ईमेल है या नहीं।
  3. ईमेल सूची फ़ाइल में समय मिलने पर हर मिनट एक दूसरा क्रॉन चलाएं, फिर ईमेल भेजने वाली स्क्रिप्ट चलाएं।
+1

क्रॉन आपको विशिष्ट समय पर फ़ंक्शंस निष्पादित करने की अनुमति देता है, नहीं? – Jeff

2

विकल्प # 1 और # 2 में क्रॉन का उपयोग करने में विशेष रूप से कुछ भी गलत नहीं है, मुझे नहीं पता कि आप किस प्रकार का ऐप उपयोग कर रहे हैं, लेकिन उपयोगकर्ताओं को सटीक मिनट में शेड्यूल करने की क्षमता आवश्यक नहीं हो सकती है। फिर भी, यह संभवतः कोई समस्या नहीं होगी यदि आपकी स्क्रिप्ट अनुस्मारक की स्थिति को "लंबित" के रूप में चिह्नित करती है या ऐसे और स्क्रिप्ट के किसी भी नए उदाहरण केवल उन लोगों को भेजते हैं जो "लंबित" या "भेजे गए" नहीं हैं।

आप हडसन या जो और स्क्रिप्ट प्रबंधन के साथ मदद कर सकता है, विफलताओं पर नज़र रखने के लिए आदि यह भी नोटिस भेज सकते हैं जब वहाँ विफलताओं हैं आप के लिए सक्षम होगा जुलता ऐप्स इस्तेमाल कर सकते हैं। यह अपने स्वयं के जावा-आधारित क्रॉन सिस्टम का समर्थन करता है।

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

+0

+1 बाहरी मेल सेवा का सुझाव देने के लिए। बाहरी मेल सेवाएं आपको आकस्मिक ब्लैक लिस्टिंग से बचाती हैं, जो आपके विचार से अधिक बार होती है, इसलिए मेरे मित्र ईमेल मार्केटिंग में कहते हैं ... – drkstr

3

आप चल रहता है कि एक PHP स्क्रिप्ट हो सकता है। प्रत्येक सेट अंतराल, उन ईमेल के लिए डेटाबेस से पूछताछ करें जिन्हें अगले अंतराल में भेजा जाना आवश्यक है। हर मिनट के लिए एक समूह के साथ एक सरणी में इसे तोड़ दें। इसलिए यदि आप 15 मिनट चुनते हैं, तो आपके पास 15 प्रविष्टियों के साथ एक सरणी होगी, प्रत्येक प्रविष्टि में उस ईमेल को भेजे जाने वाले सभी ईमेल होंगे।

आप प्रक्रिया को विभाजित करने के लिए forking का उपयोग कर सकते हैं, एक ईमेल भेजना संभालता है, दूसरा अगले मिनट तक सो जाता है और फिर से विभाजित होता है। स्केल करने के लिए, आप एक निश्चित संख्या में ईमेल को संभालने वाली प्रत्येक प्रक्रिया के साथ कई प्रक्रियाओं को फोर्क कर सकते हैं।

संक्षेप में, एक प्रक्रिया भेजने को संभालने के लिए कतार और कांटे अन्य प्रक्रियाओं का प्रबंधन करता है। जब कतार "खाली" होती है तो यह और अधिक हो जाती है। यह सुनिश्चित करने के लिए कि प्रक्रिया की मृत्यु नहीं हुई है, आप समय-समय पर क्रॉन चला सकते हैं।

1

कतार एक मेल भेजने के लिए और वास्तव में मेल भेजने भ्रमित न हों।

आपका मेल सर्वर एक भी ईमेल भेजने के लिए fifteen minutes आवश्यकता हो सकती है। लेकिन भेजने के लिए मेल संदेश कतार में mail(1) केवल 0.036s लेता है।

और यदि आप प्रति मिनट (अच्छा काम!) भेजने के लिए 1600 से अधिक ईमेल के साथ हवाएं करते हैं, तो भी आप 'स्पाइक्स' की प्रत्याशा में कई मिनट पहले अनुस्मारक ईमेल भेजने शुरू करने के लिए थोड़ा सा कोड बदल सकते हैं - - कहें, पांच मिनट तक अपने डेटाबेस में आगे बढ़ने के लिए यह देखने के लिए कि क्या 1000 मेल वितरित किए गए थे, और उन्हें 1/5 वां संभावना, 1/4 वां संभावना, 1/3 संभावना, 1/2 संभावना के साथ कतार शुरू करना, फिर कतार में जाना शेष।

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