php proc_open के बाद असली निकास कोड प्राप्त करना




process pipe (2)

मेरी समझ है कि proc_close कभी भी आपको एक कानूनी निकास कोड नहीं देगी।

पहली बार जब आप प्रक्रिया समाप्त हो गए हैं तो आप proc_get_status को चलाने के लिए केवल कानूनी निकास कोड प्राप्त कर सकते हैं। यहां एक प्रोसेस क्लास है जिसे मैंने php.net उपयोगकर्ता से नोट्स का योगदान दिया है। आपके प्रश्न का उत्तर is_running () विधि में है:

<?php
class process {

    public $cmd = '';
    private $descriptors = array(
            0 => array('pipe', 'r'),
            1 => array('pipe', 'w'),
            2 => array('pipe', 'w')
        );
    public $pipes = NULL;
    public $desc = '';
    private $strt_tm = 0;
    public $resource = NULL;
    private $exitcode = NULL;

    function __construct($cmd = '', $desc = '')
    {
        $this->cmd = $cmd;
        $this->desc = $desc;

        $this->resource = proc_open($this->cmd, $this->descriptors, $this->pipes, NULL, $_ENV);

        $this->strt_tm = microtime(TRUE);
    }

    public function is_running()
    {
        $status = proc_get_status($this->resource);

        /**
         * proc_get_status will only pull valid exitcode one
         * time after process has ended, so cache the exitcode
         * if the process is finished and $exitcode is uninitialized
         */
        if ($status['running'] === FALSE && $this->exitcode === NULL)
            $this->exitcode = $status['exitcode'];

        return $status['running'];
    }

    public function get_exitcode()
    {
        return $this->exitcode;
    }

    public function get_elapsed()
    {
        return microtime(TRUE) - $this->strt_tm;
    }
}

उम्मीद है की यह मदद करेगा।

मैं एक प्रोप्रेशन शुरू करने के लिए php में proc_open का उपयोग कर रहा हूं और आगे और पीछे डेटा भेज रहा हूं।

कुछ बिंदु पर मैं प्रक्रिया समाप्त होने और निकास कोड को पुनर्प्राप्त करने के लिए इंतजार करना चाहता हूं।

समस्या यह है कि यदि प्रक्रिया पहले से ही समाप्त हो गई है , तो मेरी कॉल को proc_close रिटर्न -1 क्या proc_close वास्तव में वापस आ गया है पर काफी भ्रम है और मुझे proc_close साथ खोले गए किसी प्रक्रिया के निकास कोड को विश्वसनीय तरीके से निर्धारित करने का कोई तरीका नहीं मिला है।

मैंने proc_get_status का उपयोग करने की कोशिश की है, लेकिन जब यह प्रक्रिया पहले से ही समाप्त हो गई है, तब भी -1 लौटाता है।

अद्यतन करें

मुझे proc_get_status प्राप्त करने के लिए कभी भी एक वैध निकास कोड नहीं मिल सकता है, भले ही यह कैसे या कब कहा जाता है। क्या यह पूरी तरह टूट गया है?


मुझे अप्रत्याशित परिणाम मिल रहा था जो proc_get_status के माध्यम से वापसी कोड प्राप्त करने की कोशिश कर रहा था, जब तक मुझे एहसास नहीं हुआ कि मुझे अंतिम आदेश की वापसी कोड मिल रहा था (मैं proc_open के आदेशों की एक श्रृंखला पास कर रहा था, अलग से;)।

एक बार मैंने आदेशों को अलग-अलग proc_open कॉल में तोड़ दिया, मैंने सही रिटर्न कोड प्राप्त करने के लिए निम्न पाश का इस्तेमाल किया। ध्यान दें कि सामान्यतः कोड दो बार proc_get_status निष्पादित कर proc_get_status , और सही वापसी कोड दूसरे निष्पादन पर वापस किया जा रहा है। इसके अलावा, नीचे दिए गए कोड खतरनाक हो सकता है अगर प्रक्रिया समाप्त नहीं होती है मैं इसे एक उदाहरण के रूप में प्रयोग कर रहा हूं:

$status = proc_get_status($process);
while ($status["running"]) {
  sleep(1);
  $status = proc_get_status($process);
}




exit-code