2011-07-12 16 views
6

भेजने वाले मेल को तेज़ करने के लिए कैसे मैंने ईमेल की भारी मात्रा में हैंडल करने और पारित पैराम के अनुसार अपनी सामग्री को पार्स करने के लिए थोक-ईमेलिंग कक्षाओं का एक सेट लिखा है। यदि मैं अपने डेटाबेस से 1000 यादृच्छिक प्राप्तकर्ताओं और 1000 यादृच्छिक प्रेषकों पर एक ईमेल का परीक्षण करता हूं, तब तक जब तक स्क्रिप्ट भेजता है() भाग (मैंने अभी इसके लिए टिप्पणी की है), मुझे लगभग 2 सेकंड का प्रदर्शन मिलता है, और 20 एमबी पीक मेमोरी , जो माहान है।PHP, sendmail और ट्रांसपोर्ट -

हालांकि, अगर मैं प्रेषण भाग को अनदेखा करता हूं, तो भेजने में 30 सेकंड लगते हैं। यह अस्वीकार्य है, और मैं इसे किसी भी तरह से गति देना चाहता हूं। यह परीक्षण से स्पष्ट है कि विलंब $ मेल-> भेजें() कॉल के अलावा किसी अन्य के कारण नहीं होता है, जैसे कि यह लूप जारी रखने और अगली ईमेल भेजने से पहले कुछ वापस करने का इंतजार कर रहा है।

मैं क्या सोच रहा हूं: मैं प्रेषण() कॉल को कैसे बढ़ा सकता हूं? इसे तेजी से बनाने के लिए मैं क्या कर सकता हूं? मैंने दो भेजने के तरीकों का उपयोग करने की कोशिश की:

  1. ज़ेंड एसएमटीपी परिवहन, सर्वर से सीधे कनेक्ट और बस भेजना। इसमें प्रति 1000 ईमेल 30 सेकंड लगते हैं।
  2. Zend_Mail के माध्यम से Sendmail। प्रत्येक ईमेल तैयार करने के बाद बस Zend_Mail के भेजें फ़ंक्शन को कॉल करें। इसमें 60 सेकंड लगते हैं।

कृपया ध्यान दें कि कतार निश्चित रूप से एक विकल्प है, और मैंने इसे अपनी कक्षाओं में बनाया है। यह सब एक क्रॉन सक्रिय है और यह एक आकर्षण की तरह काम करता है। लेकिन मैं वास्तविक भेजने और इसे गति देने के बारे में सोच रहा हूं। तो, वास्तविक भेजें() कॉल।

उत्तर

2

मैं एक निर्देशिका में मेल बचाने के लिए और एक खोल स्क्रिप्ट (क्रॉन/डेमॉन/...) का उपयोग कर उन्हें भेजना चाहते हैं:

Zend_Mail::setDefaultTransport(
    new Zend_Mail_Transport_File(
     array(
      'path' => __DIR__, 
      'callback' => function() { 
       do { 
        $file = 'email-' . date('Y-m-d_H-i-s') . '_' . mt_rand() . '.eml'; 
       } while (file_exists($file)); 
       return $file; 
      }, 
     ) 
    ) 
); 
+0

अगर मैं गलत हूं तो मुझे सही करें, लेकिन एक अच्छी MySQL क्वेरी हमेशा फ़ाइल पढ़ने के लिए बाहर रह जाएगी। क्यूइंग तंत्र पहले से ही किया जा चुका है, और अभी इसमें कोई सुधार की जरूरत नहीं है। इसी प्रकार, हमारे ईमेल प्रत्येक एक अलग सामग्री के साथ हैं। इसलिए जब हम 2 सेकंड में 1000 ईमेल भेज रहे हैं, उनमें से प्रत्येक के पास एक अलग प्राप्तकर्ता, अलग प्रेषक और विभिन्न सामग्री है। मेरा मानना ​​है कि आप यहां प्रदर्शित इस पहलू को केवल थोक ईमेलिंग में उपयोगी हो सकते हैं, हां? जहां सामग्री सभी संदेशों में समान है? यदि नहीं, तो सवाल अभी भी बनी हुई है - क्या यह डेटाबेस में कतार में तेजी से हो सकता है? मैं उलझन में हूँ। – Swader

+0

मैंने सोचा कि समस्या उत्पन्न नहीं हो रही है! :) कुछ अनुकूलित मेल सर्वर हो सकते हैं, जो संदेश के गैजिलियन को थोक-लोड करने में सक्षम होंगे। Anycase - यह php की sendmail विधि से तेज़ होगा। प्रत्यक्ष सर्वर का उपयोग PHP की तुलना में कई बार होना चाहिए (उदाहरण के लिए यह लगातार कनेक्शन का उपयोग कर सकता है)। –

+0

हम्म, काफी सही। एक तैयार ईमेल आसानी से एमएमएल प्रारूप में डिस्क पर सहेजा जा सकता है, और तब से एक स्क्रिप्ट पर ले जाएगा। यह एक वैकल्पिक कतार के रूप में भी निर्णायक रूप से सेवा कर सकता है। क्या आपके पास कुशल तरीके से ऐसा करने के कोई उदाहरण हैं? मुझे कुछ देखना अच्छा लगेगा। – Swader

2

आपको सर्वर पर एमटीए को तेज करने की आवश्यकता होगी। मैं पोस्टफिक्स की अनुशंसा करता हूं और आप वास्तव में प्रत्येक सेटिंग पर पढ़ते हैं ताकि आपको पता चले कि इसे कैसे ठीक किया जाए। एक वाणिज्यिक समाधान के लिए मैंने सुना है कि पावरएमटीए एक अच्छी पसंद है लेकिन मैंने इसे कभी भी कोशिश नहीं की है।

केवल इतना ही प्रदर्शन है कि आप एक मशीन से बाहर निकल सकते हैं, लेकिन नियमित रूप से समर्पित सर्वर इसे सही तरीके से कॉन्फ़िगर करने के बाद मेल की बजाय प्रभावशाली मात्रा वितरित करने में सक्षम होना चाहिए। सबसे बड़ी प्रदर्शन बाधा आमतौर पर डिस्क ड्राइव होती है जहां मेल कतार संग्रहित होती है, इसलिए एसएएस (10k या यहां तक ​​कि 15k RPM) या एसएसडी ड्राइव का उपयोग करने पर विचार करें।

+0

मैं निश्चित रूप से इस पर गौर करेंगे। हमारा ईमेल आउटपुट बहुत जल्द बढ़ रहा है, और इस तरह का एक कदम बहुत जरूरी हो सकता है। – Swader

+0

हमने इस दृष्टिकोण की योजना बनाना शुरू कर दिया है, लेकिन हम अपने समाधान में टॉमस का जवाब भी शामिल करेंगे। यह वास्तव में अविश्वसनीय रूप से भयानक साबित हुआ है, अब तक। – Swader

0

आप PHP pcntl-fork फ़ंक्शन में खोदने का प्रयास कर सकते हैं। इस प्रकार आप अगले ईमेल को पार्स करते समय दूसरी प्रक्रिया में भेजना छोड़ सकते हैं।

योजना बी

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

यह सुनिश्चित करने के लिए कि स्क्रिप्ट अभी भी चल रही है, आप यूनिक्स मशीनों पर monit का उपयोग कर सकते हैं। अगर किसी कारण से पुराना उदाहरण विफल हो गया है तो यह स्क्रिप्ट शुरू करने में सक्षम है।

+0

हम्म, यह बहुत आकर्षक लग रहा है, लेकिन क्या यह तथ्य नहीं है कि PHP को अपाचे मॉड्यूल के रूप में चलाने पर पीसीएनटीएल फ़ंक्शन अनुपलब्ध हैं? मुझे लगता है कि कहीं कहीं कुछ पढ़ना याद है, लेकिन अब और जानकारी नहीं मिल रही है। इसके अलावा, विंडोज मशीनों पर पीसीटीएनएल अनुपलब्ध है, और मैं इस ऐप को सभी प्रकार के ओएस पर विकसित करता हूं, जहां मैं किसी दिए गए पल में हूं .. – Swader

+0

ने योजना बी – Gedrox

+0

जोड़ा है, मैं पहले से ही इस प्रकार के क्यूइंग का उपयोग कर रहा हूं। ईमेल डेटा को क्रमबद्ध किया गया है और दी गई प्राथमिकता के साथ डीबी में सहेजा गया है। क्रोनबॉज तब हर 15 मिनट में शीर्ष प्राथमिकता ईमेल 500 प्राप्त करके समय-समय पर भेजने को संभालता है, और ऐसा लगता है कि यह सब अच्छा है। लेकिन मैं वास्तव में जो चाहता हूं वह भेजना() फ़ंक्शन को तेज़ी से बढ़ा रहा है, और एक समर्पित सर्वर शायद केवल एकमात्र और सर्वोत्तम दीर्घकालिक समाधान होगा। – Swader