2010-11-11 12 views
5

मेरे पास एक PHP वेब एप्लिकेशन है जिसे C++ लाइब्रेरी में फ़ंक्शन कॉल करने की आवश्यकता है। यह पुस्तकालय एक विक्रेता द्वारा प्रदान किया जाता है (libfoo.a एक लिनक्स मशीन पर)।PHP वेब ऐप से सी ++ लाइब्रेरी को कॉल करना: सिस्टम() बनाम एसडब्ल्यूआईजी PHP एक्सटेंशन?

  1. मेरी पहली वृत्ति एक सी ++ निष्पादन योग्य है कि libfoo.a के खिलाफ लिंक बनाने के लिए है, और कार्य करने के लिए कमांड लाइन पैरामीटर गुजरता है। PHP वेब एप्लिकेशन तब मेरे C++ निष्पादन योग्य को सिस्टम() कॉल कर सकता है। इसे लागू करना आसान होगा। मेरी चिंता यह है कि क्या प्रत्येक कॉल के लिए एक नई प्रणाली प्रक्रिया बनाने के लिए यह बहुत अधिक ओवरहेड जोड़ देगा। यह उपरांत कितना होगा?

  2. एक विकल्प यह है कि मैं PHP एक्सटेंशन में C++ फ़ंक्शन को लपेटने के लिए SWIG का उपयोग कर सकता हूं, लेकिन मेरे पास C++ स्रोत कोड नहीं है। एसडब्ल्यूआईजी समर्थन ".a" पुस्तकालय से जुड़ा हुआ है? क्या libfoo.a में निर्माण करने के लिए अपनी PHP कॉन्फ़िगरेशन बदलने के लिए मेरी टीम पर हर दूसरे इंजीनियर की आवश्यकता होगी?

प्रणाली की भूमि के ऊपर() कॉल छोटे (< 30 एमएस) है, तो मैं, विकल्प # 1 पसंद करेंगे के रूप में यह बहुत सरल लगता है सी ++ निष्पादन एक बार बनाने के लिए, और यह PHP में निर्माण नहीं आवेदन। दो विकल्पों पर आपकी सिफारिशें क्या हैं?

+0

क्या आपको 'सी ++' से आउटपुट की आवश्यकता है? यदि आप कॉल पर पृष्ठभूमि को पुश करने पर विचार नहीं कर सकते हैं - http://stackoverflow.com/questions/45953/php-execute-a-background-process – ajreal

+0

बस एक साधारण बाहरी अवलोकन, लेकिन यह जानने के बिना कि इसे कितनी बार कहा जाएगा, यह लगता है जैसे आप एक C++ निष्पादन योग्य बनाने से बेहतर होंगे (जो कि PHP के बाहर उपयोग के लिए बोनस के रूप में उपयोग करने की अनुमति देगा)। यदि आपने इसे PHP एक्सटेंशन में बनाया है, तो मुझे लगता है कि आप अनिवार्य रूप से केवल एक छोटे, निजी उपयोगकर्ता आधार के लिए वितरण और संगतता रखरखाव के दुःस्वप्न का सामना करेंगे। क्या आपने इस सवाल को खोलने के बाद से कुछ भी कोशिश की है या खोज ली है? –

उत्तर

0

सुनिश्चित नहीं हैं कि आप अंत में किया था, लेकिन मैं एक साधारण php आवरण विस्तार किया है साल पहले एक फोन कर सी ++ मुक्ति। इस तरह आप सिस्टम कॉल के ऊपर नहीं होगा। मैं आपके लिए कोई मुद्दा नहीं है, लेकिन आपके पास lib पर कॉल पर बेहतर नियंत्रण होगा। उदाहरण के लिए, प्रत्येक कॉल पर लोड करने के विपरीत, कस्टम कॉन्फ़िगरेशन पैरामीटर आदि रखने के विपरीत मेमोरी में लोड रैपर को रखते हुए मैं आपके lib की प्रकृति पर निर्भर करता हूं।

बस कुछ संदर्भों कि ब्याज की हो सकती है:

  • इस सवाल पर एक नज़र है: Extending PHP with C++?
  • आप बड़ा घूँट उल्लेख किया, लेकिन यहां भी VS2005
  • पर Zend का उपयोग कर
0

मैं विकल्प 2 की अनुशंसा करता हूं। मुझे PHP/SWIG के साथ अनुभव नहीं है लेकिन मैंने पर्ल, जावा और पीएलएसक्यूएल (ऑरैकल) के लिए एक ही काम किया है। हम कुछ कोर कार्यक्षमता को सी/सी ++ (और तीसरे पक्ष के libraires का उपयोग करें) में कोड करेंगे जो हम एक उचित wrapper में लपेटें।

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

मुख्य बिंदु याद रखने योग्य:

  • आप (आप के लिए PHP) कुछ आवेदन भाषा द्वारा प्रदान समारोह का उपयोग करने के नए डेटा के लिए किसी भी स्मृति को आबंटित करने की आवश्यकता होगी। जैसे अपने न्यूएसवी perl में।
  • आम तौर पर कुछ config पीएचपी बता जहां खोजने के लिए करने के लिए आवश्यक नहीं है अपने संकलित .so/.dll
1

मैं एक उदाहरण है कुछ आईपीसी (इंटर प्रोसेस संचार) प्रोटोकॉल का उपयोग करने का सुझाव देगा।तुम कर रहे हैं वैसे भी सी ++ आवेदन लाइब्रेरी का उपयोग कर लिखने - कुछ संचार प्रोटोकॉल लिखने (टीसीपी/आईपी या यूनिक्स सॉकेट का प्रयोग करके) और एक डेमॉन

man 3 daemon, man 2 fork और Unix sockets guide

पी.एस. देखने के रूप में आवेदन शुरू PHP में लाइब्रेरी का निर्माण करना एक अच्छा विचार नहीं है - सी ++ PHP की तरह असफलता नहीं है। यदि लाइब्रेरी या PHP मॉड्यूल क्रैश हो जाता है - संपूर्ण वेबसर्वर क्रैश हो जाता है या सर्वोत्तम परिदृश्य में एक सर्वर प्रक्रिया क्रैश हो जाती है। यदि आप इसे और प्रोग्राम/lib क्रैश को अलग करते हैं, तो आप संदेश दिखा सकते हैं कि कुछ गलत है (या यहां तक ​​कि अलर्ट ईमेल भी भेजें), जो नहीं हो सकता है यदि आपका वेब सर्वर

2

ध्यान रखें कि C++ बनाम सी उत्पादन करता है अलग-अलग फ़ंक्शन नाम इस तरह के अलग-अलग डीएलएल फ़ंक्शन नामों को समान दिखने वाले कार्यों के साथ जोड़ते हैं जिसका अर्थ है अलग-अलग लिंक।

"थर्ड पार्टी एक्सटेंशन प्रदाताओं को उनके एक्सटेंशन को पुनर्निर्माण करना होगा ताकि उन्हें विजुअल स्टूडियो सी ++ 9 बिल्डों के साथ संगत और लोड करने योग्य बनाया जा सके जो हम अब प्रदान करते हैं।"

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