2010-06-19 23 views
6

मैं सी में सबसे हल्का संभव HTTP सर्वर बनाना चाहता हूं जो PHP और संभवतः फास्टसीजीआई का समर्थन करता है यदि इससे बड़ा अंतर आएगा।सी में एक barebones, PHP- सक्षम वेब सर्वर बनाना?

मुझे यकीन नहीं है कि PHP समर्थन को कैसे कार्यान्वित किया जाए। क्या यह सिर्फ .php फ़ाइल के पथ के साथ PHP.exe को कॉल करता है और आउटपुट पढ़ता है? PHP में हेडर() जैसी चीज़ों के बारे में क्या? सर्वर द्वारा संभाले गए कैसे हैं?

और एक और सवाल, क्या प्रत्येक अनुरोध के लिए अलग-अलग धागे का उपयोग करना आदर्श है? मुझे बहुत भारी भार की उम्मीद नहीं है, लेकिन मैं इस के डिजाइन पहलू पर 100% निश्चित नहीं हूं ...

मैं अभी भी सी और सी ++ के लिए काफी नया हूं और यह एक सीखने का अनुभव है।

उत्तर

9

सबसे पहले मुझे यह कहना है कि यदि लक्ष्य एक हल्के HTTP सर्वर है जो PHP पृष्ठों की सेवा करता है, तो यह पहले से ही किया जा चुका है। nginx पर एक नज़र डालें।

एक सीखने के अनुभव के रूप में, आपने कुछ ऐसा चुना है जो वास्तव में काफी कठिन है।

मल्टीथ्रेडेड सबसे अच्छे समय पर कठिन है। सी/सी ++ पर (मैन्युअल मेमोरी आवंटन के साथ वास्तव में कुछ भी) यह परिमाण का एक क्रम कठिन है।

इसमें नेटवर्क संचार जोड़ा गया है। HTTP के विभिन्न संस्करणों (ज्यादातर अब एक गैर-समस्या) से निपटने के लिए quirks हैं, सभी प्रकार के HTTP शीर्षलेखों के साथ सौदा करने के लिए।

इस समस्या का सबसे सहज समाधान एक प्रक्रिया है जो एक बंदरगाह को सुनता है। जब इसे कोई अनुरोध प्राप्त होता है, तो यह एक प्रक्रिया उत्पन्न करता है, जो आवश्यक होने पर PHP प्रक्रिया में निष्पादित हो सकता है।

हालांकि यह स्केल नहीं करता है। पहला (स्पष्ट) अनुकूलन प्रक्रियाओं के बजाय थ्रेड का उपयोग करना और इंटरथ्रेड संचार के कुछ रूपों का उपयोग करना है। हालांकि यह मदद करता है, यह अभी भी केवल स्केल करेगा।

इससे आगे बढ़ें और आप एसिंक सॉकेट हैंडलिंग देख रहे हैं, जो काफी कम स्तर पर है।

हालांकि इनमें से सभी काफी बड़ी परियोजनाएं हैं।

क्या कोई विशेष कारण है कि आप इसे सी/सी ++ में कर रहे हैं? या किसी विशेष कारण से आप एक या दोनों भाषाओं को सीख रहे हैं? इन भाषाओं में निश्चित रूप से उनकी जगह है लेकिन वे तेजी से विशिष्ट भाषा बन रहे हैं। प्रबंधित (कचरा एकत्रित) भाषा/प्लेटफॉर्म लगभग पूरी तरह से ले लिया गया है। जोएल का तर्क है कि कचरा संग्रह पिछले 20 वर्षों में प्रोग्रामिंग में केवल बड़ी उत्पादकता में वृद्धि के बारे में है और मैं सहमत हूं।

+0

मैंने 6 साल पहले विजुअल बेसिक में यह वही काम किया है (PHP समर्थन के बिना), लेकिन सभी Async सॉकेट सामग्री को माइक्रोसॉफ्ट के विंसॉक नियंत्रण के साथ पहले से ही ख्याल रखा गया था। इसके अलावा, यह विजुअल बेसिक था, इसलिए सी या सी ++ में अच्छा लिखना बहुत कठिन होगा। (मैं वास्तव में सी से चिपकना चाहता हूं और सी ++ पर जाने से पहले वास्तव में अच्छा लगा सकता हूं)। क्या एसिंक सॉकेट वास्तव में केवल एपीआई का उपयोग कर जटिल है? मुझे ईमानदारी से कोई विचार नहीं है क्योंकि मैं विजुअल बेसिक से आया हूं। : पी ** संपादित करें: ** nginx के लिंक के लिए धन्यवाद, कभी नहीं पता था कि यह अस्तित्व में था! (मैं अभी भी एक सीखने के अनुभव के रूप में खुद को लिखने की कोशिश करना चाहता हूं)। –

+3

मैं पूरी तरह से लेने के बारे में इतना यकीन नहीं कर रहा हूँ। अपाचे, लाइटटैड, एनजिनक्स, चेरोकी ... सी में लिखे गए सभी सी। के लिए मॉलोक() प्रतिस्थापन एकत्र करने के लिए उपयुक्त कचरा भी हैं। मैं मानता हूं कि इसके ज्यादातर सिस्टम प्रोग्रामर जो आज सी का उपयोग करते हैं, लेकिन मुझे लगता है कि आला थोड़ा बड़ा है आप वर्णन करने से पहले। –

+0

@ गुइटर सी और सी ++ विभिन्न प्रोग्रामिंग प्रतिमानों के साथ वास्तव में अलग-अलग भाषाएं हैं। किसी के साथ कौशल का मतलब नहीं है और न ही दूसरे के साथ जरूरी मदद करता है। – cletus

2

सी में लिखे तुम भी पर एक नज़र लग सकता है HTTP कोड के बारे में शिक्षण अनुभव के लिए:

http://hping.org/wbox/

2

अपनी खुद की HTTP सर्वर बनाने के लिए, मैं अन्य लोगों के कोड से प्रेरणा प्राप्त करने के लिए सलाह देते हैं। प्रोग्रामर ry node.js ढांचे के लिए प्रसिद्ध इस मामले के बारे में सरल सुरुचिपूर्ण कोड लिखा है।

बाहर उसकी libebb पुस्तकालय चेक, यह एक parser का उपयोग कर Raegel साथ उत्पन्न है आसान अभी तक शक्तिशाली PEG (यह जेड शॉ का दोगला पार्सर पर आधारित है)। example usage भी देखें। यह वास्तव में साफ और उपयोग करने योग्य कोड है।

libebb is a lightweight HTTP server library for C. 
It lays the foundation for writing a web server 
by providing the socket juggling and request parsing. 
By implementing the HTTP/1.1 grammar provided 
in RFC2612, libebb understands most most valid HTTP/1.1 
connections (persistent, pipelined, and 
chunked requests included) and rejects invalid or 
malicious requests. libebb supports SSL over HTTP. 

पीएचपी-सर्वर युग्मन के बारे में, सबसे आसान तरीका है CGI है, लेकिन यदि आप SAPI (सर्वर API) के तहत मॉड्यूल php स्रोत कोड में साहसी खुदाई लगता है कि यह कैसे करना है यह देखने के लिए।

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