क्या PHP में थ्रेडिंग है?


130

मुझे यह PECL पैकेज थ्रेड्स के नाम से मिला , लेकिन अभी तक कोई रिलीज़ नहीं हुआ है। और PHP वेबसाइट पर कुछ भी नहीं आ रहा है।


किसी को पता है कि क्या यह ( pcntl_fork()) अपाचे से बुलाया जाएगा तो काम करेगा?
जोश के

यह अविश्वसनीय रूप से पुराना है, लेकिन मेरे पास एक जवाब है जो वास्तव में php में थ्रेडिंग प्रदान करता है (लिंक के लिए नीचे देखें)।
एलेक गॉर्ज

वे एक सर्वर वातावरण से कांटा नहीं बुलाने की सलाह देते हैं। मैं उन्हें दोष नहीं देता। हालाँकि, pcntl_fork PHP को थ्रेडिंग के लिए सबसे अच्छा उपाय लगता है।
just_wes

हाँ, आपको एक अपाचे 2 php प्रक्रिया को फोर्क करने की आवश्यकता नहीं होनी चाहिए।
andho

2
उपयोग pthreads आकर्षण की तरह काम करता
बाबा

जवाबों:


40

ऐसा कुछ भी उपलब्ध नहीं है जिससे मैं अवगत हूं। अगली सबसे अच्छी बात यह होगी कि सीएलआई के माध्यम से एक स्क्रिप्ट को दूसरे को निष्पादित किया जाए, लेकिन यह थोड़ा अशिष्ट है। आप क्या करने की कोशिश कर रहे हैं और यह कितना जटिल है, इसके आधार पर, यह एक विकल्प हो सकता है या नहीं भी हो सकता है।


1
बिल्कुल यही मैने सोचा। मैंने पुरानी पोस्टिंग का एक गुच्छा देखा, जिसमें उन्होंने कहा कि नहीं, और php.net पर कुछ भी नहीं है, इसलिए यह मेरा विचार था। इसकी पुष्टि के लिए धन्यवाद।
थॉमस ओवंस

2
हाँ, यह कि PECL पैकेज एक प्रकार का चिढ़ाने वाला है - मैं इसके साथ-साथ भाग गया लेकिन कभी भी इसका कुछ भी नहीं आया।
विल्को

180

Pthreads एक्सटेंशन के लिए PHP मैनुअल से :

pthreads एक ऑब्जेक्ट ओरिएंटेड एपीआई है जो PHP में उपयोगकर्ता-भूमि मल्टी-थ्रेडिंग की अनुमति देता है। इसमें वेब या कंसोल पर लक्षित बहु-थ्रेडेड एप्लिकेशन बनाने के लिए आवश्यक सभी उपकरण शामिल हैं। PHP एप्लिकेशन थ्रेड्स, वर्कर्स और स्टैकेबल्स के साथ बना, पढ़, लिख, निष्पादित और सिंक्रनाइज़ कर सकते हैं।

जैसा कि अविश्वसनीय लगता है, यह पूरी तरह सच है। आज, PHP उन लोगों के लिए बहु-धागा कर सकता है जो इसे आज़माना चाहते हैं।

PHP4 की पहली रिलीज़, 22 मई 2000, PHP को थ्रेड सेफ़ आर्किटेक्चर के साथ भेज दिया गया था - इसके लिए मल्टी-थ्रेडेड SAPI (सर्वर API) वातावरण में अलग-अलग थ्रेड्स में दुभाषिया के कई उदाहरणों को निष्पादित करने का एक तरीका है। पिछले 13 वर्षों में, इस वास्तुकला के डिजाइन को बनाए रखा गया है और उन्नत किया गया है: यह अब तक दुनिया की सबसे बड़ी वेबसाइटों पर उत्पादन उपयोग में रहा है।

उपयोगकर्ता भूमि में थ्रेडिंग कभी भी PHP टीम के लिए चिंता का विषय नहीं था, और आज भी ऐसा ही है। आपको यह समझना चाहिए कि दुनिया में जहां PHP यह व्यवसाय है, वहां पहले से ही स्केलिंग का एक परिभाषित तरीका है - हार्डवेयर जोड़ें। कई वर्षों से PHP अस्तित्व में है, हार्डवेयर सस्ता और सस्ता हो गया है और इसलिए यह PHP टीम के लिए कम और चिंता का विषय बन गया है। जबकि यह सस्ता हो रहा था, यह भी अधिक शक्तिशाली हो गया; आज, हमारे मोबाइल फोन और टैबलेट में दोहरे और क्वाड कोर आर्किटेक्चर हैं और इसके साथ जाने के लिए बहुत सारे रैम हैं, हमारे डेस्कटॉप और सर्वर में आमतौर पर 8 या 16 कोर, 16 और 32 गीगाबाइट रैम होते हैं, हालांकि हम हमेशा दो नहीं कर सकते हैं बजट के भीतर और दो डेस्कटॉप होने से शायद ही हम में से अधिकांश के लिए उपयोगी है।

इसके अतिरिक्त, PHP को गैर-प्रोग्रामर के लिए लिखा गया था, यह कई शौकीनों की मूल भाषा है। PHP इतनी आसानी से अपनाया जाता है इसका कारण यह है कि यह सीखना और लिखना एक आसान भाषा है। आज PHP इतना विश्वसनीय है क्योंकि काम की विशाल मात्रा के कारण यह डिजाइन में है, और PHP समूह द्वारा किए गए हर एक निर्णय। यह विश्वसनीयता है और सरासर महानता को इन सभी वर्षों के बाद, स्पॉट लाइट में रखना है; जहाँ यह प्रतिद्वंद्वी समय या दबाव में गिर गया है।

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

सभी चीजों पर विचार किया गया है, अभी भी लाभ हैं जो PHP को उत्पादन के उपयोग के लिए तैयार और परीक्षण सुविधाओं का उपयोग करने की अनुमति देता है, जो हमारे पास सबसे अधिक बनाने का साधन है, जब अधिक जोड़ना हमेशा एक विकल्प नहीं होता है, और बहुत कुछ के लिए। कार्यों की वास्तव में कभी जरूरत नहीं होती है।

pthreads प्राप्त करता है, इसे तलाशने के इच्छुक लोगों के लिए, एक एपीआई जो एक उपयोगकर्ता को बहु-थ्रेड PHP अनुप्रयोगों की अनुमति देता है। यह एपीआई बहुत प्रगति पर काम है, और स्थिरता और पूर्णता के एक बीटा स्तर को नामित किया है।

यह सामान्य ज्ञान है कि पुस्तकालयों के कुछ PHP उपयोग धागे सुरक्षित नहीं हैं, यह प्रोग्रामर को स्पष्ट होना चाहिए कि pthreads इसे बदल नहीं सकते हैं, और प्रयास करने का प्रयास नहीं करते हैं। हालाँकि, कोई भी लाइब्रेरी जो थ्रेड सुरक्षित है, वह प्रयोग करने योग्य है, जैसा कि दुभाषिया के किसी अन्य थ्रेड सुरक्षित सेटअप में है।

pthreads पॉज़िक्स थ्रेड्स का उपयोग करता है (विंडोज में भी), प्रोग्रामर जो भी बनाता है, निष्पादन के असली धागे हैं, लेकिन उन थ्रेड्स को उपयोगी होने के लिए, उन्हें PHP के बारे में पता होना चाहिए - उपयोगकर्ता कोड निष्पादित करने में सक्षम, चर साझा करने और संचार के एक उपयोगी साधन की अनुमति दें ( तादात्म्य )। इसलिए प्रत्येक थ्रेड दुभाषिया के एक उदाहरण के साथ बनाया गया है, लेकिन डिज़ाइन के अनुसार, यह दुभाषिया दुभाषिया के अन्य सभी उदाहरणों से अलग है - बस बहु-थ्रेडेड सर्वर एपीआई वातावरण की तरह। pthreads एक सुरक्षित और सुरक्षित तरीके से अंतर को पाटने का प्रयास करता है। सी में थ्रेडर्स के प्रोग्रामर की बहुत सी चिंताएं केवल पायथर्स के प्रोग्रामर के लिए नहीं हैं, डिजाइन द्वारा, पाइथ्स को पढ़ने पर कॉपी किया जाता है और राइट ऑन कॉपी (RAM सस्ता होता है), इसलिए कोई भी दो उदाहरण कभी भी एक ही भौतिक डेटा में हेरफेर नहीं करते हैं। , लेकिन वे दोनों एक और धागे में डेटा को प्रभावित कर सकते हैं।

पढ़ने पर कॉपी और लिखने पर कॉपी क्यों:

public function run() {
    ...
    (1) $this->data = $data;
    ...
    (2) $this->other = someOperation($this->data);
    ...
}

(3) echo preg_match($pattern, $replace, $thread->data);

(1) जबकि एक रीड, और राइट लॉक, पॉट्रेड्स ऑब्जेक्ट डेटा स्टोर पर आयोजित किए जाते हैं, डेटा को मेमोरी स्टोर में ऑब्जेक्ट में मूल स्थान से कॉपी किया जाता है। pthreads चर के प्रतिक्षेप को समायोजित नहीं करता है, Zend मूल डेटा को मुक्त करने में सक्षम है यदि इसके आगे संदर्भ नहीं हैं।

(2) कुछ ओपरेशन का तर्क ऑब्जेक्ट स्टोर, मूल डेटा को संग्रहीत करता है, जिसे वह (1) के परिणाम की एक प्रति के रूप में संदर्भित करता है, इंजन के लिए फिर से एक ज़वल कंटेनर में कॉपी किया जाता है, जबकि ऐसा तब होता है जब एक रीड लॉक ऑन होता है ऑब्जेक्ट स्टोर, लॉक जारी किया गया है और इंजन फ़ंक्शन को निष्पादित कर सकता है। जब ज़वल बनाया जाता है, तो इसमें 0 का एक रिफकाउंट होता है, जो इंजन को ऑपरेशन के पूरा होने पर कॉपी को मुक्त करने में सक्षम बनाता है, क्योंकि इसका कोई अन्य संदर्भ मौजूद नहीं है।

(3) डेटा स्टोर को प्रीग_मैच के संदर्भ में अंतिम तर्क दिया गया है, एक रीड लॉक प्राप्त किया गया है, (1) में सेट किए गए डेटा को फिर से एक ज़ेवल पर कॉपी किया जाता है, फिर से 0. के रिफंड के साथ। लॉक जारी किया जाता है, प्रीग_चैट पर कॉल चालू होता है डेटा की एक प्रति, वह स्वयं मूल डेटा की एक प्रति है।

जानने योग्य बातें:

  • ऑब्जेक्ट स्टोर की हैश तालिका जहां डेटा संग्रहीत किया जाता है, थ्रेड सुरक्षित है,
    Zend द्वारा PHP के साथ भेजे गए TsHashTable पर आधारित है।

  • ऑब्जेक्ट स्टोर में एक रीड एंड राइट लॉक होता है, TsHashTable के लिए एक अतिरिक्त एक्सेस लॉक प्रदान किया जाता है, जैसे कि अगर आवश्यकता होती है (और यह करता है, var_dump / print_r, गुणों तक सीधी पहुंच के रूप में PHP इंजन उन्हें संदर्भित करना चाहता है) pthreads TsHashTable में हेरफेर कर सकता है परिभाषित एपीआई के बाहर।

  • ताले केवल तभी आयोजित किए जाते हैं जब प्रतिलिपि कार्य होते हैं, जब प्रतियां बना दी जाती हैं, तो ताले को एक समझदार क्रम में जारी किया जाता है।

इसका मतलब है की:

  • जब कोई लेखन होता है, तो न केवल एक पढ़ने और लिखने वाला लॉक होता है, बल्कि एक अतिरिक्त एक्सेस लॉक होता है। तालिका स्वयं बंद है, कोई अन्य संदर्भ लॉक, पढ़ने, लिखने या उसे प्रभावित करने का कोई संभव तरीका नहीं है।

  • जब कोई रीड होता है, तो न केवल रीड लॉक आयोजित होता है, बल्कि अतिरिक्त एक्सेस लॉक भी होता है, फिर से टेबल लॉक हो जाता है।

कोई भी दो संदर्भ भौतिक या समवर्ती रूप से ऑब्जेक्ट स्टोर से समान डेटा तक नहीं पहुंच सकते हैं, लेकिन किसी संदर्भ में किसी संदर्भ में किसी भी संदर्भ में पढ़े गए डेटा को प्रभावित करेगा।

यह कुछ भी नहीं वास्तुकला साझा किया जाता है और अस्तित्व का एकमात्र तरीका सह-अस्तित्व है। जो थोड़ा समझदार हैं वे देखेंगे, यहां बहुत सारी नकल चल रही है, और वे आश्चर्यचकित होंगे कि क्या यह अच्छी बात है। काफी नकल एक गतिशील क्रम के भीतर चलती है, यह एक गतिशील भाषा की गतिशीलता है। ऑब्जेक्ट के स्तर पर pthreads कार्यान्वित किया जाता है, क्योंकि एक वस्तु पर अच्छा नियंत्रण प्राप्त किया जा सकता है, लेकिन प्रोग्रामर जिस कोड को निष्पादित करता है - उसका एक और संदर्भ होता है, जो लॉकिंग और कॉपियों से मुक्त होता है - स्थानीय विधि क्षेत्र। Pthreads ऑब्जेक्ट के मामले में ऑब्जेक्ट स्कोप को संदर्भों के बीच डेटा साझा करने के तरीके के रूप में माना जाना चाहिए, यह उद्देश्य है। इसे ध्यान में रखते हुए आप ऑब्जेक्ट स्टोर को लॉक करने से बचने के लिए तकनीकों को अपना सकते हैं जब तक कि यह आवश्यक न हो,

PHP के लिए उपलब्ध अधिकांश पुस्तकालयों और एक्सटेंशन 3 जी पार्टियों के आसपास पतले रैपर हैं, एक हद तक PHP कोर कार्यक्षमता एक ही बात है। पोज़िक्स पॉज़िक्स थ्रेड्स के चारों ओर एक पतली आवरण नहीं है; यह पॉसिक्स थ्रेड्स पर आधारित एक थ्रेडिंग एपीआई है। PHP में थ्रेड्स को लागू करने का कोई मतलब नहीं है कि यह उपयोगकर्ताओं को समझ में नहीं आता है या उपयोग नहीं कर सकता है। ऐसा कोई कारण नहीं है कि एक म्यूटेक्स के बारे में कोई भी जानकारी रखने वाला व्यक्ति कौशल या संसाधनों के मामले में उन सभी का लाभ उठाने में सक्षम नहीं होना चाहिए जो उनके पास हैं। एक ऑब्जेक्ट एक ऑब्जेक्ट की तरह कार्य करता है, लेकिन जहां भी दो संदर्भ अन्यथा टकराएंगे, pthreads स्थिरता और सुरक्षा प्रदान करता है।

जिस किसी ने जावा में काम किया है वह pthreads ऑब्जेक्ट और जावा में थ्रेडिंग के बीच समानता को देखेगा, उन्हीं लोगों को इसमें कोई संदेह नहीं होगा, जिसे ConcurrentModificationException नाम की त्रुटि दिखाई दे रही है - क्योंकि यह जावा रनटाइम द्वारा उठाई गई एक त्रुटि लगती है, जबकि दो थ्रेड्स एक ही भौतिक डेटा लिखते हैं समवर्ती। मैं समझता हूं कि यह क्यों मौजूद है, लेकिन यह मुझे चकित करता है कि संसाधनों के रूप में सस्ते के रूप में वे हैं, इस तथ्य के साथ मिलकर रनटाइम सही और केवल उस समय में संगणक का पता लगाने में सक्षम है जो उपयोगकर्ता के लिए सुरक्षा हासिल कर सकता है, कि यह चुनता है डेटा के निष्पादन और पहुंच को प्रबंधित करने के बजाय रनटाइम पर संभवतः एक घातक त्रुटि फेंकें।

ऐसा कोई भी बेवकूफ त्रुटियों pthreads द्वारा उत्सर्जित नहीं किया जाएगा, API को थ्रेडिंग को स्थिर बनाने के लिए लिखा गया है, और संभव के रूप में संगत है, मुझे विश्वास है।

मल्टी-थ्रेडिंग एक नए डेटाबेस का उपयोग करने की तरह नहीं है, मैनुअल में हर शब्द पर ध्यान दिया जाना चाहिए और pthreads के साथ भेजे गए उदाहरण।

अंत में, PHP मैनुअल से:

pthreads था, और है, बहुत अच्छे परिणाम के साथ एक प्रयोग। किसी भी समय इसकी कोई सीमा या सुविधाएँ बदल सकती हैं; वह प्रयोग की प्रकृति है। यह सीमाएँ हैं - अक्सर कार्यान्वयन द्वारा लगाए गए - अच्छे कारण के लिए मौजूद हैं; pthreads का उद्देश्य किसी भी स्तर पर PHP में मल्टी-टास्किंग के लिए एक उपयोगी समाधान प्रदान करना है। जिस वातावरण में pthreads निष्पादित करता है, स्थिर वातावरण प्रदान करने के लिए कुछ प्रतिबंध और सीमाएं आवश्यक हैं।


14
कोरी बकवास।
जो वाटकिंस

7
@GeoC। मुझे यह भी पक्का नहीं है कि आपकी बात यहाँ क्या है, यह सिर्फ एक प्रकार का शब्द है और आप कोई तर्क , तर्क या अन्यथा प्रदान नहीं करते हैं , क्योंकि आप किसी भी तर्क से सहमत नहीं हैं (जिनमें से मैं वास्तव में किसी भी पोस्ट में नहीं देख सकता) ।
जिम्बो

13
@ ट्यूडर मुझे नहीं लगता कि आप वास्तव में जानते हैं कि आप किस बारे में बात कर रहे हैं, इसलिए मुझे आपको अनदेखा करने में खुशी हो रही है।
जो वाटकिंस

4
@ ट्यूडर - कई वैज्ञानिकों ने अपनी शाखा में कुछ नया, या कुछ उपयोगी "बिंदु" नहीं देखा। इतिहास से पता चला है कि अधिक बार नहीं, अपने आप जैसे लोग बस गलत हैं, यह एक तथ्य है। जैसे यह एक तथ्य है कि आपने जो कुछ भी यहां लिखा है वह एक बेहतर शब्द, मल की कमी है। मैं दृढ़ता से सुझाव देता हूं, सब कुछ सकारात्मक रूप से ध्यान में रखते हुए, उन विषयों में भाग न लेने के बारे में जिन्हें आप जानते हैं कि यह (एक होने के नाते) कुछ भी नहीं है।
एनबी

12
हास्यास्पद चीज़। जो वाटकिंस pthreads के लेखक हैं, और अभी भी ट्यूडर उसे गलत साबित करने की कोशिश करता है।
हिस्टोरो वल्कनकोव

48

यहाँ विल्को ने जो सुझाव दिया उसका एक उदाहरण है:

$cmd = 'nohup nice -n 10 /usr/bin/php -c /path/to/php.ini -f /path/to/php/file.php action=generate var1_id=23 var2_id=35 gen_id=535 > /path/to/log/file.log & echo $!';
$pid = shell_exec($cmd);

मूल रूप से यह कमांड लाइन पर PHP स्क्रिप्ट को निष्पादित करता है, लेकिन तुरंत पीआईडी ​​को वापस कर देता है और फिर पृष्ठभूमि में चलता है। (गूंज $! सुनिश्चित करता है कि पीआईडी ​​के अलावा और कुछ नहीं लौटाया जाए।) इससे आपकी PHP स्क्रिप्ट जारी रह सकती है या यदि आप चाहें तो इसे छोड़ सकते हैं। जब मैंने इसका उपयोग किया है, तो मैंने उपयोगकर्ता को दूसरे पृष्ठ पर रीडायरेक्ट किया है, जहां हर 5 से 60 सेकंड में एक AJAX कॉल किया जाता है ताकि यह जांचा जा सके कि रिपोर्ट अभी भी चल रही है। (मेरे पास gen_id और इसके संबंधित उपयोगकर्ता को संग्रहीत करने के लिए एक तालिका है।) चेक स्क्रिप्ट निम्न चलती है:

exec('ps ' . $pid , $processState);
if (count($processState) < 2) {
     // less than 2 rows in the ps, therefore report is complete
}

इस तकनीक पर एक छोटी पोस्ट यहाँ है: http://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/


मुझे थोड़ी समस्या है, आप पृष्ठभूमि प्रक्रिया की स्थिति की जांच कैसे करते हैं? क्या आप मुझे
बता

25

संक्षेप में: हाँ, php में मल्टीथ्रेडिंग है लेकिन आपको इसके बजाय मल्टीप्रोसेसिंग का उपयोग करना चाहिए।

बैकग्राउड जानकारी: थ्रेड्स बनाम प्रोसेस

हमेशा थ्रेड्स और प्रक्रियाओं के भेद के बारे में थोड़ा भ्रम होता है, इसलिए मैं जल्द ही दोनों का वर्णन करूंगा:

  • एक धागा कमांड का एक क्रम है जो सीपीयू प्रोसेस करेगा। इसमें शामिल एकमात्र डेटा प्रोग्राम काउंटर है। प्रत्येक CPU कोर एक समय में केवल एक थ्रेड को संसाधित करेगा, लेकिन शेड्यूलिंग के माध्यम से विभिन्न लोगों के निष्पादन के बीच स्विच कर सकता है।
  • एक प्रक्रिया साझा संसाधनों का एक समूह है। इसका मतलब है कि इसमें मेमोरी, चर, ऑब्जेक्ट इंस्टेंस, फ़ाइल हैंडल, म्यूटेक्स, डेटाबेस कनेक्शन और इसी तरह का एक हिस्सा शामिल है। प्रत्येक प्रक्रिया में एक या एक से अधिक धागे होते हैं। एक ही प्रक्रिया के सभी थ्रेड्स अपने संसाधनों को साझा करते हैं, इसलिए आप एक चर का उपयोग कर सकते हैं जिसे आपने दूसरे में बनाया था। यदि वे धागे दो अलग-अलग प्रक्रियाओं के भाग हैं, तो वे सीधे एक-दूसरे के संसाधनों तक नहीं पहुँच सकते। इस मामले में आपको उदाहरण के लिए पाइप, फाइलें, सॉकेट्स के माध्यम से अंतर-प्रक्रिया संचार की आवश्यकता होती है ...

बहु

आप php के साथ नई प्रक्रियाओं (जिसमें एक नया धागा भी शामिल है) बनाकर समानांतर कंप्यूटिंग प्राप्त कर सकते हैं। यदि आपके थ्रेड्स को अधिक संचार या सिंक्रनाइज़ेशन की आवश्यकता नहीं है, तो यह आपकी पसंद है, क्योंकि प्रक्रियाएं अलग-थलग हैं और एक-दूसरे के काम में हस्तक्षेप नहीं कर सकती हैं। यहां तक ​​कि अगर एक दुर्घटना, दूसरों की चिंता नहीं है। यदि आपको अधिक संचार की आवश्यकता है, तो आपको "मल्टीथ्रेडिंग" पर पढ़ना चाहिए या - दुख की बात है - किसी अन्य प्रोग्रामिंग भाषा का उपयोग करने पर विचार करें, क्योंकि अंतर-प्रक्रिया संचार और सिंक्रनाइज़ेशन बहुत जटिलता का परिचय देता है।

Php में आपके पास नई प्रक्रिया बनाने के दो तरीके हैं:

ओएस को आपके लिए करने दें : आप अपने ऑपरेशन सिस्टम को एक नई प्रक्रिया बनाने और उसमें एक नई (या समान) php स्क्रिप्ट चलाने के लिए कह सकते हैं।

  • के लिए linux आप निम्नलिखित का उपयोग करें या विचार कर सकते हैं डैरिल हेन के जवाब :

    $cmd = 'nice php script.php 2>&1 & echo $!';
    pclose(popen($cmd, 'r'));
  • के लिए खिड़कियों आप इसका उपयोग कर सकते:

    $cmd = 'start "processname" /MIN /belownormal cmd /c "script.php 2>&1"';
    pclose(popen($cmd, 'r'));

एक कांटा के साथ यह खुद करो : php भी फ़ंक्शन pcntl_fork () के माध्यम से forking का उपयोग करने की संभावना प्रदान करता है । यह कैसे करना है पर एक अच्छा ट्यूटोरियल यहां पाया जा सकता है लेकिन मैं दृढ़ता से इसका उपयोग नहीं करने की सलाह देता हूं, क्योंकि कांटा मानवता के खिलाफ और विशेष रूप से ऊप के खिलाफ अपराध है

बहु सूत्रण

मल्टीथ्रेडिंग के साथ आपके सभी धागे अपने संसाधनों को साझा करते हैं ताकि आप आसानी से बहुत अधिक ओवरहेड के बीच संवाद कर सकें और उन्हें सिंक्रनाइज़ कर सकें। दूसरी तरफ आपको यह जानना होगा कि आप क्या कर रहे हैं, क्योंकि दौड़ की स्थिति और गतिरोध पैदा करना आसान है लेकिन डिबग करना बहुत मुश्किल है।

मानक php कोई मल्टीथ्रेडिंग प्रदान नहीं करता है लेकिन एक (प्रायोगिक) विस्तार है जो वास्तव में करता है - pthreads । इसके एपीआई प्रलेखन ने भी इसे php.net में बनाया । इसके साथ आप कुछ सामान कर सकते हैं जैसा कि आप वास्तविक प्रोग्रामिंग भाषाओं में कर सकते हैं :-) इस तरह से:

class MyThread extends Thread {
    public function run(){
        //do something time consuming
    }
}

$t = new MyThread();
if($t->start()){
    while($t->isRunning()){
        echo ".";
        usleep(100);
    }
    $t->join();
}

लिनक्स के लिए स्टैकओवरफ्लो में यहीं एक इंस्टॉलेशन गाइड है

खिड़कियों के लिए अब एक है:

  • सबसे पहले आपको php के थ्रेड-सुरक्षित संस्करण की आवश्यकता है।
  • आपको pthreads और इसके php एक्सटेंशन दोनों के पूर्व-संकलित संस्करणों की आवश्यकता है। उन्हें यहाँ डाउनलोड किया जा सकता है । सुनिश्चित करें कि आप उस संस्करण को डाउनलोड करते हैं जो आपके php संस्करण के साथ संगत है।
  • अपने php एक्सटेंशन फ़ोल्डर ([phpDirectory] / ext) में php_pthreads.dll (आपके द्वारा अभी डाउनलोड की गई ज़िप से) कॉपी करें।
  • PthreadVC2.dll को [phpDirectory] (रूट फ़ोल्डर - एक्सटेंशन फ़ोल्डर नहीं) में कॉपी करें।
  • [PhpDirectory] /php.ini संपादित करें और निम्नलिखित पंक्ति डालें

    extension=php_pthreads.dll
  • ऊपर की स्क्रिप्ट के साथ इसे कुछ नींद या कुछ के साथ परीक्षण करें जहां टिप्पणी है।

और अब बड़ा BUT : हालाँकि यह वास्तव में काम करता है, php मूल रूप से मल्टीथ्रेडिंग के लिए नहीं बनाया गया था। इसमें php का थ्रेड-सुरक्षित संस्करण मौजूद है और v5.4 के रूप में यह लगभग बग-मुक्त प्रतीत होता है, लेकिन बहु-थ्रेडेड वातावरण में php का उपयोग करना अभी भी php मैनुअल में हतोत्साहित किया जाता है (लेकिन शायद उन्होंने अभी अपने मैनुअल को अपडेट नहीं किया है यह, अभी तक)। एक बहुत बड़ी समस्या यह हो सकती है कि बहुत सारे सामान्य एक्सटेंशन थ्रेड-सुरक्षित नहीं हैं । तो आप इस php एक्सटेंशन के साथ थ्रेड प्राप्त कर सकते हैं, लेकिन आप जिन कार्यों पर निर्भर हैं, वे अभी भी थ्रेड-सुरक्षित नहीं हैं, इसलिए आप शायद रेस की स्थिति, गतिरोध और कोड में आपका सामना नहीं करेंगे।


5
यह बहुत ही गलत है, आपके द्वारा संदर्भित लेख 2008 का है। अगर PHP कोर पर सुरक्षित नहीं होता तो उसमें SAPF मॉड्यूल नहीं होता।
जो वाटकिंस

1
@ जो: ठीक है, मैंने इसे कोर में बदल दिया है थ्रेड-सुरक्षित लेकिन बहुत सारे एक्सटेंशन नहीं हैं।
फ्रैंकोइस बुर्जुआ

1
बहुत सारे? मुझे लगता है कि आप इसे बहुत कम पाएंगे, आपने दस्तावेज़ ढूंढ लिया है, लेकिन इसे ठीक से पढ़ने में विफल रहे हैं: ध्यान दें: जो * के साथ चिह्नित हैं वे थ्रेड-सुरक्षित लाइब्रेरी नहीं हैं, और मल्टी में सर्वर मॉड्यूल के रूप में PHP के साथ उपयोग नहीं किया जाना चाहिए -थ्रेडेड विंडोज वेब सर्वर (IIS, नेटस्केप)। यह यूनिक्स वातावरण में अभी तक कोई फर्क नहीं पड़ता है।
जो वाटकिंस

6
PHP बहुत ही थ्रेड सुरक्षित है, और कई वर्षों से है, कुछ बाहरी लाइब्रेरी और कुछ बंडल वाले नहीं हैं, लेकिन यह अच्छी तरह से प्रलेखित है, और वैसे भी बहुत स्पष्ट है। pthreads थ्रेड बनाता है जो कि बहु-थ्रेडेड sapi में zend द्वारा बनाए गए थ्रेड्स जितना सुरक्षित होता है, मुझे यह पता है, क्योंकि मैंने, अकेले, pthreads लिखा है। यह PHP द्वारा उजागर हर उपलब्ध एपीआई का उपयोग सर्वर एपीआई के रूप में करता है, मैं यह नहीं कह रहा हूं कि यह पूरी तरह से स्थिर है, लेकिन आपने जो चित्र चित्रित किया है वह सिर्फ सादा गलत है और बहुत खराब सूचना है।
जो वाटकिंस

@ जो: जब मैनुअल कहता है कि यह यूनिक्स वातावरण के लिए कोई फर्क नहीं पड़ता है, तो वे इस तथ्य का उल्लेख कर रहे हैं कि यूनिक्स सिस्टम एपाचे पर कई प्रक्रियाओं का उपयोग करता है और विंडोज पर यह थ्रेड्स का उपयोग करता है। इसलिए मूल रूप से वे कह रहे हैं "यदि आप वैसे भी धागे का उपयोग नहीं कर रहे हैं, तो आपको गैर-थ्रेड-सुरक्षित एक्सटेंशन के बारे में चिंता करने की ज़रूरत नहीं है।" जब हम थ्रेड्स का उपयोग pthreads के साथ करते हैं, तो यह - निश्चित रूप से - यूनिक्स वातावरण पर भी मायने रखता है।
फ्रेंकोइस बुर्जुआ

17

धागे के समान कुछ हासिल करने के लिए आप pcntl_fork () का उपयोग कर सकते हैं । तकनीकी रूप से यह अलग-अलग प्रक्रियाएं हैं, इसलिए दोनों के बीच संचार थ्रेड्स के साथ सरल नहीं है, और मेरा मानना ​​है कि अगर पीएचपी को अपाचे द्वारा बुलाया जाता है तो यह काम नहीं करेगा।


4
मैं एक बड़े पैमाने पर डेटा आयात कार्य को समानांतर करने के लिए सफलतापूर्वक pcntl_fork का उपयोग कर रहा हूं। महान काम करता है, और मैंने इसे लगभग एक घंटे में काम किया था। सीखने की अवस्था का एक सा है, लेकिन एक बार जब आप समझते हैं कि क्या चल रहा है, तो यह बहुत सीधा है।
फ्रैंक किसान

फ्रैंक, यह सीएलआई php या अपाचे PHP के साथ है?
आर्टेम रसाकोवस्की

@ आर्ट: मैं भी जानना चाहूंगा।
जोश के

5
@ फ्रेंक किसान हमें चिढ़ा रहा है ... PECL पैकेज की तरह।
रोजर

1
मैं सीएलआई के साथ pcntl_fork का उपयोग कर रहा था। मैंने इसे अपाचे में कभी नहीं आज़माया है; यह जोखिम भरा लगता है। सीएलआई पर भी, कुछ अप्रत्याशित मुद्दे थे। मुझे ऐसा प्रतीत हो रहा था कि जहां एक बच्चे ने डेटाबेस हैंडल बंद कर दिया है (क्योंकि यह अपना काम पूरा कर रहा है), इसने भाई-बहनों के लिए कनेक्शन भी बंद कर दिया। चूंकि बच्चे माता-पिता की नकल हैं, इसलिए विषमता की तैयारी करें। जब से मैंने अपना कोड नया करने के लिए पुन: डिज़ाइन किया है, निष्पादन के माध्यम से पूरी तरह से अलग प्रक्रियाएं () - यह उस तरह से क्लीनर है।
फ्रैंक किसान

13

अगर किसी को परवाह है, तो मैंने php_threading को पुनर्जीवित किया है (थ्रेड्स के समान नहीं, लेकिन समान) और मेरे पास वास्तव में यह उस बिंदु पर है जहां यह (कुछ) अच्छी तरह से काम करता है!

प्रोजेक्ट पेज

डाउनलोड करें (Windows PHP 5.3 VC9 TS के लिए)

उदाहरण

README


7

pcntl_fork()वह है जो आप खोज रहे हैं, लेकिन इसकी प्रक्रिया थ्रेडिंग नहीं है। इसलिए आपको डेटा एक्सचेंज की समस्या होगी। उन्हें हल करने के लिए आप phps semaphore फ़ंक्शंस का उपयोग कर सकते हैं ( http://www.php.net/manual/de/ref.sem.php ) का संदेश कतार साझा स्मृति खंडों की तुलना में शुरुआत के लिए थोड़ा आसान हो सकता है।

वैसे भी, एक रणनीति मैं एक वेब फ्रेमवर्क में उपयोग कर रहा हूं जो मैं विकसित कर रहा हूं जो एक वेब पेज के संसाधन गहन ब्लॉकों को लोड करता है (संभवतः बाहरी अनुरोधों के साथ) समानांतर: मैं यह जानने के लिए एक नौकरी कतार में कर रहा हूं कि मैं किस डेटा का इंतजार कर रहा हूं और फिर मैं कांटा हर प्रक्रिया के लिए नौकरी बंद। एक बार जब वे एपीसी कैश में अपने डेटा को एक अनोखी कुंजी के तहत संग्रहित करते हैं तो अभिभावक प्रक्रिया तक पहुँच सकते हैं। एक बार हर डेटा के बाद यह जारी है। मैं सरल का उपयोग कर रहा हूं।usleep() प्रतीक्षा करने के लिए का क्योंकि अपाचे में अंतर प्रक्रिया संचार संभव नहीं है (बच्चे अपने माता-पिता से संबंध ढीले कर देंगे और लाश बन जाएंगे ...)। इसलिए यह मुझे आखिरी बात पर ले जाता है: हर बच्चे को मारने के लिए इसका महत्वपूर्ण हिस्सा! वहाँ के रूप में अच्छी तरह से कक्षाएं हैं जो कांटा प्रक्रियाओं लेकिन डेटा रखने के लिए, मैं उन्हें जांच नहीं किया, लेकिन zend फ्रेमवर्क एक है, और वे आम तौर पर धीमी लेकिन मज़बूती से कोड करते हैं। आप इसे यहां देख सकते हैं: http://zendframework.com/manual/1.9/en/zendx.console.process.unix.overview.html मुझे लगता है कि वे shm सेगमेंट का उपयोग करते हैं! अच्छी तरह से अंतिम लेकिन कम से कम इस zend वेबसाइट पर कोई त्रुटि नहीं है, उदाहरण में मामूली गलती।

while ($process1->isRunning() && $process2->isRunning()) {
    sleep(1);
}
should of course be:
while ($process1->isRunning() || $process2->isRunning()) {
    sleep(1);
}

6

PThreads के आधार पर एक थ्रेडिंग विस्तार किया जा रहा है जो एक्टीली विकसित किया गया है जो https://github.com/krakjoe/pthreads पर बहुत आशाजनक लगता है



5

मेरे पास एक PHP थ्रेडिंग क्लास है जो दो साल से अधिक समय से प्रोडक्शन के माहौल में बेकार चल रहा है।

EDIT: यह अब एक कंपोजर लाइब्रेरी के रूप में और मेरे MVC फ्रेमवर्क, हज़ार MVC के हिस्से के रूप में उपलब्ध है।

देखें: https://git.hazaarlabs.com/hazaar/hazaar-thread


क्या होगा अगर, आपके उदाहरण के बाद, file.php में प्रोग्राम, उदाहरण के लिए कहता है, यह 10k वेबसाइट की यूरिस की सूची के अस्तित्व को रोकता है और फिर परिणाम को CSV फ़ाइल में सहेजना होगा ... क्या यह फ़ाइल राइटिंग नहीं होगी संकट?
रोजर

उप-प्रक्रिया वेब-सर्वर / मूल स्क्रिप्ट के समान उपयोगकर्ता के रूप में चलेगी। इसलिए जब आप फाइलें लिखते हैं तो आपके पास सामान्य रूप से अनुमतियों के संबंध में समान विचार होंगे। यदि आपको फ़ाइलें लिखने में समस्या है, तो लिखने की कोशिश करें / tmp और जब वह काम कर रहा हो, तो वहां से जाएं।
जेमी कार्ल

1
लिंक, एक नया स्वरूप के कारण मृत अब तुम यहाँ वेबैक मशीन पर प्राप्त कर सकते हैं: web.archive.org/web/20130922043615/http://dev.funkynerd.com/...
टोनी

अब मेरे MVC ढांचे में जोड़ा गया। देखें: git.hazaarlabs.com/hazaar/hazaar-thread
Jamie Carl

2

मुझे पता है कि यह एक पुराना सवाल है, लेकिन आप http://phpthreadlib.sourceforge.net/ पर देख सकते हैं

द्वि-दिशात्मक संचार, Win32 के लिए समर्थन और कोई एक्सटेंशन की आवश्यकता नहीं है।


1

कभी appserverतकनीक के बारे में सुना है ?

यह php में लिखा गया है और उच्च ट्रैफ़िक php अनुप्रयोगों के लिए मल्टीथ्रेड्स को प्रबंधित करने वाले एक प्रशिक्षक के रूप में काम करता है। अभी भी बीटा में है लेकिन बहुत आशाजनक है।


-3

बल्कि अस्पष्ट है, और जल्द ही पदावनत किया जाना है, जिसे टिक कहा जाता है । केवल एक चीज जिसे मैंने कभी इसके लिए उपयोग किया है, वह है स्क्रिप्ट को SIGKILL (Ctrl + C) पर कब्जा करने और इनायत से बंद करने की अनुमति देना।


3
टिक्स समानांतर में निष्पादित नहीं करते हैं। अनिवार्य रूप से, प्रत्येक कथन के बाद, आपका टिक फ़ंक्शन चलता है। जबकि आपका टिक फ़ंक्शन चल रहा है, मुख्य कोड नहीं चल रहा है।
फ्रैंक किसान

1
टिक केवल संकेत () हैंडलर के लिए आवश्यक हैं।
निक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.