खोज…


अंतर्निहित कांटा कार्यों का उपयोग करके बहुप्रक्रिया करना

आप 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 () का उपयोग करके बच्चे की प्रक्रिया को बंद करना याद रखें, जो बच्चे को समाप्त कर देगा और निकास स्थिति कोड वापस कर देगा।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow