और प्रश्न पर एक नज़र डालने के लिए धन्यवाद।PHP क्लाइंट और सी डेमॉन सर्वर के बीच आईपीसी कैसे करें?
पृष्ठभूमि
मैं कई मशीनों है कि लगातार एक बहुत ही कम समय सीमा में कई अंडे (300 तक) पीएचपी सांत्वना स्क्रिप्ट हैं। ये स्क्रिप्ट तेजी से चलती हैं (एक सेकंड से भी कम) और फिर बाहर निकलें। इन लिपियों के सभी एक बड़ी trie संरचना करने के लिए केवल पहुँच जो स्मृति में हर बार स्क्रिप्ट में से हर एक चलाता है लोड करने के लिए बहुत महंगा हो जाएगा पढ़ा है। सर्वर लिनक्स चलाता है।
मेरे समाधान
एक सी डेमॉन कि स्मृति में trie संरचना रहता है और PHP ग्राहकों से अनुरोध प्राप्त बनाएँ। यह प्रत्येक PHP क्लाइंट से अनुरोध प्राप्त करेगा, मेमोरी स्ट्रक्चर पर लुकअप करेगा और उत्तर के साथ जवाब देगा, PHP स्क्रिप्ट को उस काम से सहेजने से बचाएगा। दोनों अनुरोध और प्रतिक्रियाओं संक्षिप्त स्ट्रिंग (अब की तुलना में 20 वर्ण)
मेरे समस्या
मैं सी डेमॉन और अंतर प्रक्रिया संचार करने के लिए बहुत नया हूँ कर रहे हैं। बहुत से शोध के बाद, मैंने संदेशों को संदेश कतारों और यूनिक्स डोमेन सॉकेट तक सीमित कर दिया है। संदेश पंक्तियां पर्याप्त प्रतीत होती हैं क्योंकि मुझे लगता है कि (मैं गलत हो सकता हूं) कि वे डेमॉन के लिए सभी अनुरोधों को क्रमशः उत्तर देने के लिए कतारबद्ध करते हैं। यूनिक्स डोमेन सॉकेट का उपयोग करना आसान प्रतीत होता है, हालांकि। हालांकि, मेरे पास कई प्रश्न हैं जिनके जवाब मुझे नहीं मिल पाए हैं:
- PHP स्क्रिप्ट कैसे संदेश भेज सकता है और प्राप्त कर सकता है या डेमॉन के साथ संवाद करने के लिए यूनिक्स सॉकेट का उपयोग कैसे कर सकता है? इसके विपरीत सी डीमन किस ट्रैक प्रक्रिया को ट्रैक करने के लिए ट्रैक भेजता है?
- डेमॉन के अधिकांश उदाहरण मैं एक अनंत का उपयोग करते हुए एक सोने हालत के अंदर के साथ पाश को देखा है। मेरे डिमन को कई कनेक्शनों की सेवा करने की ज़रूरत है जो किसी भी समय आ सकती हैं, और प्रतिक्रिया विलंबता महत्वपूर्ण है। अगर नींद सो रही है तो PHP स्क्रिप्ट अनुरोध भेजता है तो डेमॉन प्रतिक्रिया कैसे करेगा? मैंने चुनाव और एपोल के बारे में पढ़ा है, क्या यह एक प्राप्त संदेश की प्रतीक्षा करने का सही तरीका होगा?
- प्रत्येक पीएचपी प्रक्रिया हमेशा एक अनुरोध भेज देंगे, और फिर एक प्रतिक्रिया प्राप्त करने के लिए इंतजार करेंगे। मुझे यकीन है कि अगर डेमॉन नीचे/उपलब्ध नहीं है, पीएचपी प्रक्रिया एक सेट अधिक से अधिक समय के लिए एक प्रतिक्रिया के लिए इंतजार करेंगे बनाने की जरूरत है, और अगर कोई जवाब नहीं प्राप्त होता है फांसी की परवाह किए बिना बजाय जारी रहेगा। क्या यह किया जा सकता है?
डेटा संरचना का वास्तविक लुकअप बहुत तेज़ है, मुझे किसी भी जटिल बहु-थ्रेडिंग या इसी तरह के समाधान की आवश्यकता नहीं है, क्योंकि मुझे लगता है कि फीफो तरीके से अनुरोधों को संभालने के लिए पर्याप्त होगा। मुझे इसे सरल बेवकूफ रखने की भी आवश्यकता है, क्योंकि यह एक मिशन महत्वपूर्ण सेवा है, और मैं इस प्रकार के कार्यक्रम के लिए बिल्कुल नया हूं। (मुझे पता है, लेकिन मैं वास्तव में इस के आसपास कोई रास्ता नहीं है, और सीखने का अनुभव बहुत अच्छा होगा)
मैं वास्तव में कोड के टुकड़े कि मेरे पास है कि विशिष्ट प्रश्नों पर कुछ प्रकाश डालने की सराहना करेंगे। गाइड और पॉइंटर्स के लिए लिंक जो कम स्तर के आईपीसी की इस अस्पष्ट दुनिया में मेरी समझ को आगे बढ़ाएंगे, उनका भी स्वागत है।
आपकी मदद के लिए धन्यवाद!
अद्यतन
यह जानते हुए भी बहुत कुछ अब से मैं इस सवाल पूछने का समय था, मैं सिर्फ दिलचस्पी है कि दोनों Thrift ढांचे और ZeroMQ दूर सार संक्षेप का एक शानदार काम कर किसी को बाहर बिंदु करना चाहता था हार्ड, सॉकेट-स्तरीय प्रोग्रामिंग। बहाव आपको सर्वर के लिए मचान भी मुफ्त में देता है!
वास्तव में, नेटवर्क सर्वर बनाने के सभी कड़ी मेहनत के लिए जाने के बजाय, आपको एक अच्छा एसिंक्रोनस सर्वर का उपयोग करके केवल एप्लिकेशन सर्वर कोड लिखने पर विचार करें जो पहले से ही आपके लिए समस्या हल कर चुका है। बेशक सर्वर जो एसिंक्रोनस आईओ का उपयोग करते हैं वे उन नेटवर्क अनुप्रयोगों के लिए बहुत अच्छे हैं जिन्हें गहन CPU प्रोसेसिंग (या अन्य ईवेंट लूप ब्लॉक) की आवश्यकता नहीं होती है।
पायथन के लिए उदाहरण: Twisted, gevent। मैं gevent पसंद करते हैं, और मैं टर्ननाडो शामिल नहीं है क्योंकि यह HTTP सर्वर पक्ष पर केंद्रित है।
रूबी के लिए उदाहरण: EventMachine
बेशक, Node.js मूल रूप से एक async सर्वर आजकल के लिए डिफ़ॉल्ट विकल्प है।
यदि आप गहरे जाना चाहते हैं, तो C10k Problem, और Unix Network Programing पढ़ें।
मतदान हाँ, डेमॉन होना चाहिए, और मुझे विश्वास है कि यूनिक्स तुम सब करने की है कुर्सियां के साथ है सॉकेट पीएचपी में संकलित करने का समर्थन करते है .. लेकिन मुझे पूरी तरह से यकीन नहीं है – Earlz