2012-06-03 18 views
9

मैं PHP में pcntl_fork के बारे में उलझन में हूं।PHP में pcntl_fork कैसे काम करता है?

मुझे पता है कि यह बहु-थ्रेडिंग करता है, लेकिन यह कैसे काम करता है और मैं इसे स्क्रिप्ट में कैसे उपयोग करूं?

+0

देखें http://stackoverflow.com/q/19546588/632951 – Pacerier

उत्तर

26

पीसीएनटीएल धागे नहीं बना सकता है। यह केवल वर्तमान PHP प्रक्रिया "फोर्क" है। इसका क्या मतलब है? जब आप pcntl_fork() पर कॉल करते हैं, तो वर्तमान प्रक्रिया को दो प्रक्रियाओं में विभाजित किया जाता है। मूल प्रक्रिया के पूरे नामस्थान को बच्चे में कॉपी किया गया है और दोनों प्रक्रियाएं केवल एक अंतर के साथ समानांतर में निष्पादन के साथ जारी रहती हैं: pcntl_fork() बच्चे में बच्चे के पीआईडी ​​और बच्चे में 0 लौटाता है।

कुछ संकेत:

  • यह डिफ़ॉल्ट रूप से अक्षम है। यदि आप इसे सक्षम करने के लिए प्रबंधन करते हैं, तो इसे केवल सीएलआई के लिए करें। वेब सर्वर के साथ कभी भी इसका इस्तेमाल न करें! यह गैर-निर्धारक तरीके से व्यवहार करेगा। यह पूरी मशीन नीचे भी ला सकता है। कृपया इसे अक्षम करें और पढ़ें।
  • प्रक्रियाओं के बीच संचार संभव है लेकिन भयानक (साझा स्मृति में धारावाहिक वस्तु के माध्यम से)।
  • फ़ाइल डिस्क्रिप्टर (और डेटाबेस कनेक्शन) साझा किए जाते हैं, इससे समस्याएं अक्सर होती हैं। आपको को फटने के बाद अपने डीबी को फिर से कनेक्ट करना होगा या जब आप उनमें से पहले कनेक्शन बंद कर देते हैं तो आपको सभी फोर्क प्रक्रियाओं से MySQL server has gone away जैसी त्रुटियां मिलेंगी।
  • अभिभावक प्रक्रिया को बच्चों को समाप्त करने के लिए इंतजार करना पड़ता है या यह ज़ोंबी प्रक्रियाओं को पीछे संसाधन प्रणाली संसाधनों को छोड़ देगा।

यहाँ उदाहरण from documentation है:

<?php 

$pid = pcntl_fork(); 
if ($pid == -1) { 
    die('could not fork'); 
} else if ($pid) { 
    // we are the parent 
    pcntl_wait($status); //Protect against Zombie children 
} else { 
    // we are the child 
} 

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

फोर्क किए गए PHP प्रोग्राम को पढ़ने, समझने और डीबग करने में बहुत मुश्किल है। उस कार्यक्रम को बनाए रखना एक दुःस्वप्न होगा।

गलती मत करो और फोर्किंग से बचें। आपको इसकी आवश्यकता नहीं है आपको वास्तव में क्या चाहिए अतुल्यकालिक कार्य धावक है। अच्छी खबर है, वहाँ है RabbitMQ और nice tutorial ;-) तुम भी RabbitMQ पुस्तकालय का वादा कोशिश कर सकते हैं कहा जाता Bunny

पुनश्च: का उपयोग करते हुए संदेश कतार बजाय forking आप एक और लाभ देता है। आप कई सर्वरों के साथ कतार को संसाधित कर सकते हैं और क्षैतिज रूप से स्केल कर सकते हैं क्योंकि आपका ट्रैफ़िक बढ़ता है।

+0

धन्यवाद आपका उत्तर मेरी मदद करता है :) –