खोज…
अंतर्निहित कांटा कार्यों का उपयोग करके बहुप्रक्रिया करना
आप PHP प्रक्रियाओं को कांटे के रूप में चलाने के लिए अंतर्निहित कार्यों का उपयोग कर सकते हैं। समानांतर कार्य को प्राप्त करने का यह सबसे सरल तरीका है यदि आपको एक दूसरे से बात करने के लिए अपने धागों की आवश्यकता नहीं है।
यह आपको समय गहन कार्य करने की अनुमति देता है (जैसे किसी फ़ाइल को किसी अन्य सर्वर पर अपलोड करना या ईमेल भेजना) दूसरे धागे पर इसलिए आपकी स्क्रिप्ट तेज़ी से लोड होती है और कई कोर का उपयोग कर सकती है लेकिन ध्यान रखें कि यह वास्तविक मल्टीथ्रेडिंग नहीं है और आपका मुख्य धागा नहीं होगा जानते हैं कि बच्चे क्या कर रहे हैं।
ध्यान दें कि विंडोज के तहत यह आपके द्वारा शुरू किए गए प्रत्येक कांटे के लिए एक और कमांड प्रॉम्प्ट पॉप अप करेगा।
master.php
$cmd = "php worker.php 10";
if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') // for windows use popen and pclose
{
pclose(popen($cmd,"r"));
}
else //for unix systems use shell exec with "&" in the end
{
exec('bash -c "exec nohup setsid '.$cmd.' > /dev/null 2>&1 &"');
}
worker.php
//send emails, upload files, analyze logs, etc
$sleeptime = $argv[1];
sleep($sleeptime);
कांटा का उपयोग करके बच्चे की प्रक्रिया बनाना
PHP ने चाइल्ड प्रोसेस बनाने के लिए फंक्शन pcntl_fork
में बनाया है। pcntl_fork
यूनिक्स में fork
समान है। यह किसी भी पैरामीटर में नहीं लेता है और पूर्णांक देता है जिसका उपयोग माता-पिता और बच्चे की प्रक्रिया के बीच अंतर करने के लिए किया जा सकता है। स्पष्टीकरण के लिए निम्नलिखित कोड पर विचार करें
<?php
// $pid is the PID of child
$pid = pcntl_fork();
if ($pid == -1) {
die('Error while creating child process');
} else if ($pid) {
// Parent process
} else {
// Child process
}
?>
जैसा कि आप देख सकते हैं -1
कांटे में त्रुटि है और बच्चा पैदा नहीं हुआ था। बच्चे के निर्माण पर, हमारे पास अलग-अलग PID
साथ चलने वाली दो प्रक्रियाएं हैं।
यहां एक और विचार एक zombie process
या defunct process
जब मूल प्रक्रिया बच्चे की प्रक्रिया से पहले खत्म हो जाती है। एक ज़ोंबी बच्चों की प्रक्रिया को रोकने के लिए बस मूल प्रक्रिया के अंत में pcntl_wait($status)
जोड़ें।
pnctl_wait बच्चे की प्रक्रिया से बाहर निकलने तक मूल प्रक्रिया के निष्पादन को निलंबित करता है।
यह भी ध्यान देने योग्य है कि SIGKILL
सिग्नल का उपयोग करके zombie process
को नहीं मारा जा सकता है।
अंतःप्रक्रम संचार
इंटरप्रोसेस संचार प्रोग्रामर को विभिन्न प्रक्रियाओं के बीच संवाद करने की अनुमति देता है। उदाहरण के लिए, आइए हम एक PHP एप्लिकेशन लिखने की आवश्यकता पर विचार करें जो बैश कमांड चला सकते हैं और आउटपुट प्रिंट कर सकते हैं। हम proc_open
का उपयोग कर रहे हैं, जो कमांड को निष्पादित करेगा और एक संसाधन लौटाएगा जिससे हम संवाद कर सकते हैं। निम्न कोड एक मूल कार्यान्वयन दिखाता है जो php
से bash
में pwd
चलाता है
<?php
$descriptor = array(
0 => array("pipe", "r"), // pipe for stdin of child
1 => array("pipe", "w"), // pipe for stdout of child
);
$process = proc_open("bash", $descriptor, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], "pwd" . "\n");
fclose($pipes[0]);
echo stream_get_contents($pipes[1]);
fclose($pipes[1]);
$return_value = proc_close($process);
}
?>
proc_open
डिस्क्रिप्टर विनिर्देशों के रूप में $descriptor
साथ bash
कमांड चलाता है। उसके बाद हम प्रक्रिया को मान्य करने के लिए is_resource
का उपयोग करते हैं। एक बार जब हम $ पाइप का उपयोग करके बच्चे की प्रक्रिया के साथ बातचीत शुरू कर सकते हैं जो कि डिस्क्रिप्टर विनिर्देशों के अनुसार उत्पन्न होती है।
उसके बाद हम बस बच्चे की प्रक्रिया की fwrite
को लिखने के लिए राइटिंग का उपयोग कर सकते हैं। इस मामले में pwd
ने गाड़ी वापसी की। अंत में stream_get_contents
का उपयोग बाल प्रक्रिया के stream_get_contents
को पढ़ने के लिए किया जाता है।
हमेशा proc_close () का उपयोग करके बच्चे की प्रक्रिया को बंद करना याद रखें, जो बच्चे को समाप्त कर देगा और निकास स्थिति कोड वापस कर देगा।