मैंने PHP के लिए अलग-अलग बायनेरीज़ देखे, जैसे कि नॉन-थ्रेड या थ्रेड सेफ?
इसका क्या मतलब है?
इन पैकेजों में क्या अंतर है?
मैंने PHP के लिए अलग-अलग बायनेरीज़ देखे, जैसे कि नॉन-थ्रेड या थ्रेड सेफ?
इसका क्या मतलब है?
इन पैकेजों में क्या अंतर है?
जवाबों:
विभिन्न वेब सर्वर समानांतर में आने वाले HTTP अनुरोधों को संभालने के लिए विभिन्न तकनीकों को लागू करते हैं। एक बहुत लोकप्रिय तकनीक थ्रेड्स का उपयोग कर रही है - अर्थात, वेब सर्वर प्रत्येक आने वाले अनुरोध के लिए एक ही थ्रेड बनाएगा / समर्पित करेगा। अपाचे HTTP वेब सर्वर अनुरोधों को संभालने के लिए कई मॉडलों का समर्थन करता है, जिनमें से एक (कार्यकर्ता एमपीएम कहा जाता है) थ्रेड्स का उपयोग करता है। लेकिन यह एक अन्य संगामिति मॉडल का समर्थन करता है जिसे प्रीफ़ॉर्क एमपीएम कहा जाता है जो प्रक्रियाओं का उपयोग करता है - अर्थात, वेब सर्वर प्रत्येक अनुरोध के लिए एक एकल प्रक्रिया बनाएगा / समर्पित करेगा।
अन्य पूरी तरह से अलग संगामिति मॉडल (एसिंक्रोनस सॉकेट्स और I / O का उपयोग करके), साथ ही साथ दो या तीन मॉडल को एक साथ मिलाने वाले भी हैं। इस प्रश्न का उत्तर देने के उद्देश्य से, हम केवल ऊपर दिए गए दो मॉडल से संबंधित हैं, और Apache HTTP सर्वर को एक उदाहरण के रूप में लेते हैं।
PHP स्वयं वास्तविक HTTP अनुरोधों का जवाब नहीं देता है - यह वेब सर्वर का काम है। इसलिए हम प्रसंस्करण के लिए PHP के आगे अनुरोधों के लिए वेब सर्वर को कॉन्फ़िगर करते हैं, फिर परिणाम प्राप्त करते हैं और इसे उपयोगकर्ता को वापस भेजते हैं। PHP के साथ वेब सर्वर को चेन करने के कई तरीके हैं। अपाचे HTTP सर्वर के लिए, सबसे लोकप्रिय "mod_php" है। यह मॉड्यूल वास्तव में PHP ही है, लेकिन वेब सर्वर के लिए एक मॉड्यूल के रूप में संकलित किया गया है, और इसलिए यह सही इसके अंदर लोड हो जाता है।
अपाचे और अन्य वेब सर्वर के साथ PHP का पीछा करने के लिए अन्य तरीके हैं, लेकिन mod_php सबसे लोकप्रिय है और आपके प्रश्न का उत्तर देने के लिए भी काम करेगा।
हो सकता है कि आपको पहले इन विवरणों को समझने की आवश्यकता न हो, क्योंकि होस्टिंग कंपनियाँ और GNU / Linux डिस्ट्रोस हमारे लिए तैयार सब कुछ लेकर आते हैं।
चूंकि mod_php के साथ, PHP सही तरीके से Apache में लोड हो जाता है, यदि Apache अपने वर्कर MPM (अर्थात थ्रेड्स का उपयोग करते हुए) का उपयोग करके संगामिति को संभालने जा रहा है, तो PHP को इसी बहु-थ्रेडेड वातावरण में संचालित करने में सक्षम होना चाहिए - अर्थ, PHP है अपाचे के साथ गेंद को सही ढंग से खेलने में सक्षम होने के लिए थ्रेड-सुरक्षित हो!
इस बिंदु पर, आप सोच रहे होंगे "ठीक है, इसलिए यदि मैं एक बहु-थ्रेडेड वेब सर्वर का उपयोग कर रहा हूं और मैं PHP को सही में एम्बेड करने जा रहा हूं, तो मुझे PHP के थ्रेड-सुरक्षित संस्करण का उपयोग करना होगा"। और यह सही सोच होगी। हालांकि, जैसा कि होता है, PHP की थ्रेड-सुरक्षा अत्यधिक विवादित है । यह एक उपयोग-अगर-आप-वास्तव में-वास्तव में पता है कि आप क्या कर रहे हैं।
यदि आप सोच रहे हैं, तो मेरी व्यक्तिगत सलाह होगी कि यदि आपके पास विकल्प हो तो बहु-थ्रेडेड वातावरण में PHP का उपयोग न करें!
केवल यूनिक्स-आधारित वातावरण के बारे में बात करते हुए, मैं कहूंगा कि सौभाग्य से, आपको केवल यह सोचना होगा कि क्या आप Apache वेब सर्वर के साथ PHP का उपयोग करने जा रहे हैं, जिस स्थिति में आपको Apache के पूर्व सांसद MPM के साथ जाने की सलाह दी जाती है (जो धागे का उपयोग नहीं करता है, और इसलिए, PHP थ्रेड-सुरक्षा कोई फर्क नहीं पड़ता) और सभी जीएनयू / लिनक्स वितरण जो मुझे पता है कि आप के लिए उस निर्णय को ले लेंगे जब आप अपने पैकेज सिस्टम के माध्यम से अपाचे + पीएचपी स्थापित कर रहे हैं, यहां तक कि आपको संकेत दिए बिना। एक विकल्प के लिए। यदि आप अन्य webservers जैसे कि nginx या lighttpd का उपयोग करने जा रहे हैं , तो आपके पास वैसे भी PHP एम्बेड करने का विकल्प नहीं होगा। आप FastCGI या कुछ समान का उपयोग करते हुए देखेंगे जो एक अलग मॉडल में काम करता है जहां PHP पूरी तरह से बाहर हैउदाहरण के लिए FastCGI के माध्यम से अनुरोधों का जवाब देने के लिए उपयोग की जाने वाली कई PHP प्रक्रियाओं के साथ वेब सर्वर। ऐसे मामलों के लिए, थ्रेड-सुरक्षा भी मायने नहीं रखती है। यह देखने के लिए कि आपकी वेबसाइट किस संस्करण का उपयोग कर <?php phpinfo(); ?>
रही है, अपनी साइट पर एक फ़ाइल डालें और Server API
प्रविष्टि देखें। यह कुछ ऐसा कह सकता है CGI/FastCGI
या Apache 2.0 Handler
।
यदि आप PHP के कमांड-लाइन संस्करण को भी देखते हैं - थ्रेड सुरक्षा कोई फर्क नहीं पड़ता।
अंत में, यदि थ्रेड-सुरक्षा कोई फर्क नहीं पड़ता है तो आपको किस संस्करण का उपयोग करना चाहिए - थ्रेड-सेफ या नॉन-थ्रेड-सेफ़? सच कहूँ तो, मेरे पास वैज्ञानिक जवाब नहीं है! लेकिन मुझे लगता है कि गैर-थ्रेड-सुरक्षित संस्करण तेज़ और / या कम छोटी गाड़ी है, या अन्यथा उन्होंने केवल थ्रेड-सुरक्षित संस्करण की पेशकश की होगी और हमें विकल्प देने की जहमत नहीं उठाई होगी!
मेरे लिए, मैं हमेशा गैर-थ्रेड सुरक्षित संस्करण का चयन करता हूं क्योंकि मैं हमेशा nginx का उपयोग करता हूं, या कमांड लाइन से PHP चलाता हूं।
यदि आप PHP को CGI बाइनरी, कमांड लाइन इंटरफ़ेस या अन्य वातावरण में स्थापित करते हैं तो केवल गैर-थ्रेड सुरक्षित संस्करण का उपयोग किया जाना चाहिए जहां केवल एक थ्रेड का उपयोग किया जाता है।
यदि आप किसी कार्यकर्ता MPM (मल्टी-प्रोसेसिंग मॉडल) या अन्य वातावरण में जहां कई PHP थ्रेड समवर्ती चलाते हैं, तो PHP को अपाचे मॉड्यूल के रूप में PHP स्थापित करने के लिए एक थ्रेड-सुरक्षित संस्करण का उपयोग किया जाना चाहिए।
Modphp के साथ Apache MPM प्रीफ़ॉर्क का उपयोग किया जाता है क्योंकि इसे कॉन्फ़िगर / इंस्टॉल करना आसान है। प्रदर्शन-वार यह काफी अक्षम है। स्टैक करने के लिए मेरा पसंदीदा तरीका है, FastCGI / PHP-FPM। इस तरह से आप बहुत तेजी से एमपीएम वर्कर का उपयोग कर सकते हैं। पूरा PHP गैर-थ्रेडेड रहता है, लेकिन Apache थ्रेडेड सेवा करता है (जैसे इसे चाहिए)।
तो मूल रूप से, नीचे से ऊपर तक
लिनक्स
Apache + MPM वर्कर + ModFastCGI (NOT FCGI) | (या) | चेरोकी | (या) | nginx
PHP-FPM + APC
ModFCGI PHP-FPM, या किसी भी बाहरी FastCGI एप्लिकेशन का सही ढंग से समर्थन नहीं करता है। यह केवल गैर-प्रक्रिया प्रबंधित FastCGI स्क्रिप्ट का समर्थन करता है। PHP-FPM PHP FastCGI प्रोसेस मैनेजर है।
PHP प्रलेखन के अनुसार ,
थ्रेड सेफ्टी का मतलब है कि बाइनरी मल्टीथ्रेडेड वेबसर्वर संदर्भ में काम कर सकता है, जैसे कि विंडोज पर अपाचे 2। थ्रेड सेफ्टी प्रत्येक थ्रेड में एक स्थानीय स्टोरेज कॉपी बनाकर काम करता है, ताकि डेटा दूसरे थ्रेड से न टकराए।
तो मैं क्या चुनूं? यदि आप PHP को CGI बाइनरी के रूप में चलाना चुनते हैं, तो आपको थ्रेड सुरक्षा की आवश्यकता नहीं होगी, क्योंकि बाइनरी प्रत्येक अनुरोध पर लागू होती है। मल्टीथ्रेडेड वेबसर्वर, जैसे कि IIS5 और IIS6 के लिए, आपको PHP के थ्रेडेड संस्करण का उपयोग करना चाहिए।
निम्नलिखित पुस्तकालयों धागा सुरक्षित नहीं हैं। उन्हें बहु-थ्रेडेड वातावरण में उपयोग करने के लिए अनुशंसित नहीं किया जाता है।