PHP में धागा सुरक्षित या गैर-थ्रेड सुरक्षित क्या है?


772

मैंने PHP के लिए अलग-अलग बायनेरीज़ देखे, जैसे कि नॉन-थ्रेड या थ्रेड सेफ?

इसका क्या मतलब है?

इन पैकेजों में क्या अंतर है?


18
आप के बारे में पर सुरक्षा थ्रेड पढ़ सकते हैं en.wikipedia.org/wiki/Thread_safety पीएचपी के बारे में: Is पीएचपी धागा सुरक्षित Do झूठ पर विश्वास नहीं: पीएचपी थ्रेड-सुरक्षित नहीं है फिर भी पीएचपी धागा सुरक्षित और गैर धागा सुरक्षित binarie के बीच अंतर वहाँ बहुत सारे संसाधन उपलब्ध हैं। Stackoverflow या Google पर यहां खोजें।
टाइगरटाइगर

जवाबों:


667

समसामयिक दृष्टिकोण की आवश्यकता पृष्ठभूमि:

विभिन्न वेब सर्वर समानांतर में आने वाले HTTP अनुरोधों को संभालने के लिए विभिन्न तकनीकों को लागू करते हैं। एक बहुत लोकप्रिय तकनीक थ्रेड्स का उपयोग कर रही है - अर्थात, वेब सर्वर प्रत्येक आने वाले अनुरोध के लिए एक ही थ्रेड बनाएगा / समर्पित करेगा। अपाचे HTTP वेब सर्वर अनुरोधों को संभालने के लिए कई मॉडलों का समर्थन करता है, जिनमें से एक (कार्यकर्ता एमपीएम कहा जाता है) थ्रेड्स का उपयोग करता है। लेकिन यह एक अन्य संगामिति मॉडल का समर्थन करता है जिसे प्रीफ़ॉर्क एमपीएम कहा जाता है जो प्रक्रियाओं का उपयोग करता है - अर्थात, वेब सर्वर प्रत्येक अनुरोध के लिए एक एकल प्रक्रिया बनाएगा / समर्पित करेगा।

अन्य पूरी तरह से अलग संगामिति मॉडल (एसिंक्रोनस सॉकेट्स और I / O का उपयोग करके), साथ ही साथ दो या तीन मॉडल को एक साथ मिलाने वाले भी हैं। इस प्रश्न का उत्तर देने के उद्देश्य से, हम केवल ऊपर दिए गए दो मॉडल से संबंधित हैं, और Apache HTTP सर्वर को एक उदाहरण के रूप में लेते हैं।

PHP कैसे वेब सर्वर के साथ "एकीकृत" पर पृष्ठभूमि की जरूरत है:

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 के कमांड-लाइन संस्करण को भी देखते हैं - थ्रेड सुरक्षा कोई फर्क नहीं पड़ता।

अंत में, यदि थ्रेड-सुरक्षा कोई फर्क नहीं पड़ता है तो आपको किस संस्करण का उपयोग करना चाहिए - थ्रेड-सेफ या नॉन-थ्रेड-सेफ़? सच कहूँ तो, मेरे पास वैज्ञानिक जवाब नहीं है! लेकिन मुझे लगता है कि गैर-थ्रेड-सुरक्षित संस्करण तेज़ और / या कम छोटी गाड़ी है, या अन्यथा उन्होंने केवल थ्रेड-सुरक्षित संस्करण की पेशकश की होगी और हमें विकल्प देने की जहमत नहीं उठाई होगी!


2
तो PHP-FPM पिरोया नहीं है? यह समस्या तब हल करती है जब से फास्ट सीजीआई का उपयोग नगनेक्स सर्वर पर किया जाता है।
Xeoncross 28:30

41
विस्मयकारी विस्तार, मैं वर्षों से PHP में प्रोग्रामिंग कर रहा हूँ और यह कभी नहीं जानता था।
पैट्रिक

1
@ Xeoncross: आम तौर पर यह सही है, और व्यवहार में यह अपाचे के बाहर PHP प्रक्रियाओं का प्रबंधन करने के लिए महान कारणों में से एक है। मैं अपने जवाब में इस पहलू पर जाता हूं।
जेएम बेकर

यहां एकमात्र समस्या यह है कि PHP-FPM विंडोज के तहत उपलब्ध नहीं है। कम से कम देशी निर्माण के रूप में।
डेनिस वी

9
क्या PHP की थ्रेड सुरक्षा अभी भी "अत्यधिक विवादित" है (2015 और संस्करण 7 में)?
अल्टियानो पियानो 12/15

261

मेरे लिए, मैं हमेशा गैर-थ्रेड सुरक्षित संस्करण का चयन करता हूं क्योंकि मैं हमेशा nginx का उपयोग करता हूं, या कमांड लाइन से PHP चलाता हूं।

यदि आप PHP को CGI बाइनरी, कमांड लाइन इंटरफ़ेस या अन्य वातावरण में स्थापित करते हैं तो केवल गैर-थ्रेड सुरक्षित संस्करण का उपयोग किया जाना चाहिए जहां केवल एक थ्रेड का उपयोग किया जाता है।

यदि आप किसी कार्यकर्ता MPM (मल्टी-प्रोसेसिंग मॉडल) या अन्य वातावरण में जहां कई PHP थ्रेड समवर्ती चलाते हैं, तो PHP को अपाचे मॉड्यूल के रूप में PHP स्थापित करने के लिए एक थ्रेड-सुरक्षित संस्करण का उपयोग किया जाना चाहिए।


1
ग्रेग अपने जवाब किया जाना चाहिए था: "एक धागा सुरक्षित संस्करण आप एक अपाचे मॉड्यूल जहां कार्यकर्ता एम पी एम के रूप में पीएचपी स्थापित करना चाहते हैं प्रयोग किया जाना चाहिए"
WLF

9
इतना php कि विंडोज़ पर xampp के साथ आ रहा है NTS या TS?
अबुदैह

1
यदि आप PHP में निर्मित वेब सर्वर का उपयोग करते हैं तो क्या होगा? PHP का कौन सा संस्करण इष्टतम प्रदर्शन के लिए उपयोग करना है?
एरियोड

1
@Dario मुझे लगता है कि यह सिर्फ विंडोज है।
ग्रेग

1
@ क्रिसस्टरशॉ दोस्त, जवाब में केवल राय है। कोई अपाचे मॉड्यूल के साथ संयोजन में ZTS का उपयोग करने के लिए कोई स्रोत या कारण नहीं है। इसका मान्य उत्तर नहीं है। यहां तक ​​कि 217 पीपीएल गलत एम 8 हो सकता है।
डैनियल डब्ल्यू।

30

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 प्रोसेस मैनेजर है।


21

PHP प्रलेखन के अनुसार ,

PHP डाउनलोड करते समय थ्रेड सुरक्षा का क्या अर्थ है?

थ्रेड सेफ्टी का मतलब है कि बाइनरी मल्टीथ्रेडेड वेबसर्वर संदर्भ में काम कर सकता है, जैसे कि विंडोज पर अपाचे 2। थ्रेड सेफ्टी प्रत्येक थ्रेड में एक स्थानीय स्टोरेज कॉपी बनाकर काम करता है, ताकि डेटा दूसरे थ्रेड से न टकराए।

तो मैं क्या चुनूं? यदि आप PHP को CGI बाइनरी के रूप में चलाना चुनते हैं, तो आपको थ्रेड सुरक्षा की आवश्यकता नहीं होगी, क्योंकि बाइनरी प्रत्येक अनुरोध पर लागू होती है। मल्टीथ्रेडेड वेबसर्वर, जैसे कि IIS5 और IIS6 के लिए, आपको PHP के थ्रेडेड संस्करण का उपयोग करना चाहिए।

निम्नलिखित पुस्तकालयों धागा सुरक्षित नहीं हैं। उन्हें बहु-थ्रेडेड वातावरण में उपयोग करने के लिए अनुशंसित नहीं किया जाता है।

  • SNMP (यूनिक्स)
  • mSQL (यूनिक्स)
  • IMAP (विन / यूनिक्स)
  • Sybase-CT (लिनक्स, libc5)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.