अपने प्रश्न के पहले भाग का उत्तर देने के लिए:हां, आप PHP के साथ एसिंक्रोनस अनुरोध कर सकते हैं , और यहां तक कि सेवा की प्रतिक्रिया पर ध्यान न दें। हालांकि, जैसा कि आप सही कहते हैं कि यह एक बहुत अच्छा समाधान नहीं है।
एसिंक्रोनस अनुरोध
Segment.io द्वारा PHP अतुल्यकालिक अनुरोधों पर यह उत्कृष्ट ब्लॉग पोस्ट कई निष्कर्ष निकलते हैं:
- आप सॉकेट खोल सकते हैं और उस पर लिख सकते हैं , जैसा कि इस स्टैक ओवरफ़्लो विषय द्वारा वर्णित है - हालांकि, ऐसा लगता है कि यह वास्तव में अवरुद्ध और काफी धीमा है (उनके परीक्षणों में 300ms)।
- आप लॉग फ़ाइल में लिख सकते हैं और फिर इसे दूसरे तरीके से संसाधित कर सकते हैं (अनिवार्य रूप से एक कतार, जैसा आप वर्णन करते हैं) - हालांकि, इसके लिए लॉग को पढ़ने और इसे संसाधित करने के लिए एक और प्रक्रिया की आवश्यकता होती है। फ़ाइल सिस्टम का उपयोग धीमा हो सकता है, और साझा की गई फ़ाइलें सभी प्रकार की समस्याओं का कारण बन सकती हैं।
- आप कर्ल अनुरोध को फोर्क कर सकते हैं - हालांकि, इसका मतलब है कि आप किसी प्रतिक्रिया की प्रतीक्षा नहीं कर रहे हैं, इसलिए यदि SendGrid (या कोई अन्य सेवा) किसी त्रुटि के साथ प्रतिक्रिया करता है, तो आप उसे पकड़ कर प्रतिक्रिया नहीं दे सकते।
राय भूमि
अब हम सेमी-ओपिनियन लैंड में प्रवेश कर रहे हैं , लेकिन जैसा कि आप वर्णन करते हैं कतारें (जैसे कि क्रॉन जॉब के साथ एक mySQL एक, या एक टेक्स्ट फ़ाइल, या कुछ और) बहुत स्केलेबल होती हैं क्योंकि आप श्रमिकों को कतार में फेंक सकते हैं यदि आपको इसे तेजी से संसाधित करने की आवश्यकता है। ये आपके यूजर फेसिंग सिस्टम से बाहर हो सकते हैं (और इसलिए संसाधनों को साझा नहीं करते हैं)।
कतार
एक कतार के साथ, आपके पास एक अलग सेवा होगी जो SendGrid (उदा.) के साथ ईमेल भेजने के लिए ज़िम्मेदार होगा। यह कार्यों को एक कतार से हटा देगा (उदाहरण के लिए "निक को एक ईमेल भेजें") और फिर उस पर अमल करें।
कतारों को लागू करने के कई तरीके हैं जिन्हें आप संसाधित कर सकते हैं।
- आप अपना खुद का लिख सकते हैं - जैसा कि आप PHP/mySQL पर बने रहना चाहते हैं, यदि आप ऐसा करते हैं तो आपको कतार की समस्याओं और अजीब किनारे के मामलों को ध्यान में रखना होगा। हालांकि, आपके पास पूर्ण नियंत्रण होगा और एक साधारण अनुप्रयोग के लिए शायद यह काम करेगा।
- आप स्वयं द्वारा होस्ट की गई कार्य कतार लागू कर सकते हैं - अजवाइन एक वितरित कार्य कतार के लिए अभिप्रेत है, øMQ (ZeroMQ) और RabbitMQ टास्क क्यू के रूप में भी इस्तेमाल किया जा सकता है। ये तेज़ और वितरित होने के लिए हैं और इनमें बहुत विचार किया गया है। यह देखने के लिए कि क्या वे इसे गति देते हैं, आपको उन्हें अपने सिस्टम में बेंचमार्क करना होगा। इसका मतलब यह भी होगा कि आपको अतिरिक्त टुकड़ों को स्वयं होस्ट करना होगा। हालांकि, यह संचार के दृष्टिकोण से सबसे तेज़ समाधान होने की संभावना है।
- आप चीजों को होस्ट की गई कार्य कतार में भेज सकते हैं - IronMQ और Amazon SQS दोनों ही शानदार होस्ट समाधान हैं, जिसका अर्थ है कि आपको IronWorkers के अतिरिक्त संसाधनों को उन्हें समर्पित करने की आवश्यकता नहीं होगी। (जैसे) आप दूसरी सेवा का ध्यान रख सकते हैं। हालांकि, चूंकि आप किसी बाहरी सेवा के लिए अनुरोध को अनुकूलित करने का प्रयास कर रहे हैं, इस परिदृश्य में शायद यह समाधान नहीं है।
ईमेल कतारबद्ध करना
ईमेल कतारबद्ध करने के विषय पर (विशेष रूप से), ईमेल भेजने वालों के लिए यह कुछ सामान्य है। हर चीज की तरह इसका मतलब है कि आपके पास बेहतर विश्वसनीयता हो सकती है (क्योंकि अगर कोई सेवा विफल हो जाती है तो आप उसे कतार में रख सकते हैं और पुनः प्रयास कर सकते हैं)।
हालांकि ईमेल के साथ, संदेशों को कतारबद्ध करने के लिए कुछ विशिष्ट सेवाएं हैं। ये एसएमटीपी सर्वर हैं। सैद्धांतिक रूप से आप sendmail जैसा सर्वर सेटअप कर सकते हैं और फिर SendGrid को अपने "स्मार्टहोस्ट" के रूप में सेट करें या रिले करें और सर्वर को SendGrid को भेजें। यह तब कतार में खड़ा होता है और सेवा रुकावटों से निपटता है और थोड़े अतिरिक्त कोड के साथ मेल भेजता है। हालांकि , SMTP सर्वरों से निपटने के लिए कठिनाइयाँ हैं, भले ही वे केवल संदेशों को अग्रेषित कर रहे हों। इसके अतिरिक्त, कनेक्शन स्थापित करने के लिए SMTP HTTP से भी धीमा है और संभवतः वह नहीं जो आप चाहते हैं, लेकिन यह जानना अच्छा है।