PHP proc_open открывается несколько раз

У меня есть служебная функция, используемая для выполнения программы через CLI (cmd, bash и т. Д.). Он возвращает массив из 3 элементов: STDOUT , STDERR и КОД ВЫХОДА .

До сих пор он работал нормально, без проблем. На самом деле проблема, с которой я столкнулся, на самом деле не мешает его функциональности, но меня беспокоит производительность.

Проблема в том, что в некоторых случаях PHP запускает одну и ту же команду несколько раз (в моем случае 3 раза) , даже если предполагалось сделать это только один раз.

/**
 * Executes a program and waits for it to finish, taking pipes into account.
 * @param string $cmd Command line to execute, including any arguments.
 * @param string $input Data for standard input.
 * @param boolean $log Whether to log execution failures or not (defaults to true).
 * @return array Array of "stdout", "stderr" and "return".
 */
public static function execute($cmd,$stdin=null,$log=true){
    //static $once=true; if(!$once)die; $once=false;
    $proc=proc_open($cmd, array(
        0=>array('pipe','r'),
        1=>array('pipe','w'),
        2=>array('pipe','w')   ), $pipes);
    fwrite($pipes[0],$stdin);                fclose($pipes[0]);
    $stdout=stream_get_contents($pipes[1]);  fclose($pipes[1]);
    $stderr=stream_get_contents($pipes[2]);  fclose($pipes[2]);
    $return=proc_close($proc);
    if($return!=0 && $log)
        xlog('Error: Program execution returned failure.',$stdout,$stderr,$return);
    return array( 'stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$return );
}

Обратите внимание на закомментированную строку (строка 9). Это было для тестирования. Я включил его, чтобы целевая программа запускалась только один раз (я думал, что мой код может каким-то образом вызывать ту же функцию).

У меня есть служебная функция, используемая для выполнения программы через интерфейс командной строки (cmd, bash и т. Д.). Он возвращает массив из трех элементов: STDOUT , STDERR и КОД ВЫХОДА .

До сих пор он работал нормально, без проблем. На самом деле, проблема, с которой я столкнулся, на самом деле не мешает его функциональности, но меня беспокоит производительность.

Проблема в том, что в некоторых случаях PHP выполняет одну и ту же команду несколько раз (3 раза в моем случае) , даже если предполагалось сделать это только один раз.

/**
 * Executes a program and waits for it to finish, taking pipes into account.
 * @param string $cmd Command line to execute, including any arguments.
 * @param string $input Data for standard input.
 * @param boolean $log Whether to log execution failures or not (defaults to true).
 * @return array Array of "stdout", "stderr" and "return".
 */
public static function execute($cmd,$stdin=null,$log=true){
    //static $once=true; if(!$once)die; $once=false;
    $proc=proc_open($cmd, array(
        0=>array('pipe','r'),
        1=>array('pipe','w'),
        2=>array('pipe','w')   ), $pipes);
    fwrite($pipes[0],$stdin);                fclose($pipes[0]);
    $stdout=stream_get_contents($pipes[1]);  fclose($pipes[1]);
    $stderr=stream_get_contents($pipes[2]);  fclose($pipes[2]);
    $return=proc_close($proc);
    if($return!=0 && $log)
        xlog('Error: Program execution returned failure.',$stdout,$stderr,$return);
    return array( 'stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$return );
}

Обратите внимание на закомментированную строку (строка 9). Это было для тестирования. Я включил его, чтобы целевая программа запускалась только один раз (я думал, что мой код может каким-то образом вызывать ту же функцию).

У меня есть служебная функция, используемая для выполнения программы через интерфейс командной строки (cmd, bash и т. Д.). Он возвращает массив из 3 элементов: STDOUT , STDERR и КОД ВЫХОДА .

До сих пор он работал нормально, без проблем. На самом деле, проблема, с которой я столкнулся, на самом деле не мешает его функциональности, но меня беспокоит производительность.

Проблема в том, что в некоторых случаях PHP выполняет одну и ту же команду несколько раз (3 раза в моем случае) , даже если предполагалось сделать это только один раз.

/**
 * Executes a program and waits for it to finish, taking pipes into account.
 * @param string $cmd Command line to execute, including any arguments.
 * @param string $input Data for standard input.
 * @param boolean $log Whether to log execution failures or not (defaults to true).
 * @return array Array of "stdout", "stderr" and "return".
 */
public static function execute($cmd,$stdin=null,$log=true){
    //static $once=true; if(!$once)die; $once=false;
    $proc=proc_open($cmd, array(
        0=>array('pipe','r'),
        1=>array('pipe','w'),
        2=>array('pipe','w')   ), $pipes);
    fwrite($pipes[0],$stdin);                fclose($pipes[0]);
    $stdout=stream_get_contents($pipes[1]);  fclose($pipes[1]);
    $stderr=stream_get_contents($pipes[2]);  fclose($pipes[2]);
    $return=proc_close($proc);
    if($return!=0 && $log)
        xlog('Error: Program execution returned failure.',$stdout,$stderr,$return);
    return array( 'stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$return );
}

Обратите внимание на закомментированную строку (строка 9). Это было для тестирования. Я включил его, чтобы целевая программа запускалась только один раз (я думал, что мой код может каким-то образом вызывать ту же функцию). STDERR и КОД ВЫХОДА .

До сих пор он работал нормально, без проблем. На самом деле, проблема, с которой я столкнулся, на самом деле не мешает его функциональности, но меня беспокоит производительность.

Проблема в том, что в некоторых случаях PHP выполняет одну и ту же команду несколько раз (3 раза в моем случае) , даже если предполагалось сделать это только один раз.

/**
 * Executes a program and waits for it to finish, taking pipes into account.
 * @param string $cmd Command line to execute, including any arguments.
 * @param string $input Data for standard input.
 * @param boolean $log Whether to log execution failures or not (defaults to true).
 * @return array Array of "stdout", "stderr" and "return".
 */
public static function execute($cmd,$stdin=null,$log=true){
    //static $once=true; if(!$once)die; $once=false;
    $proc=proc_open($cmd, array(
        0=>array('pipe','r'),
        1=>array('pipe','w'),
        2=>array('pipe','w')   ), $pipes);
    fwrite($pipes[0],$stdin);                fclose($pipes[0]);
    $stdout=stream_get_contents($pipes[1]);  fclose($pipes[1]);
    $stderr=stream_get_contents($pipes[2]);  fclose($pipes[2]);
    $return=proc_close($proc);
    if($return!=0 && $log)
        xlog('Error: Program execution returned failure.',$stdout,$stderr,$return);
    return array( 'stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$return );
}

Обратите внимание на закомментированную строку (строка 9). Это было для тестирования. Я включил его, чтобы целевая программа запускалась только один раз (я думал, что мой код может каким-то образом вызывать ту же функцию). STDERR и КОД ВЫХОДА .

До сих пор он работал нормально, без проблем. На самом деле, проблема, с которой я столкнулся, на самом деле не мешает его функциональности, но меня беспокоит производительность.

Проблема в том, что в некоторых случаях PHP выполняет одну и ту же команду несколько раз (3 раза в моем случае) , даже если предполагалось сделать это только один раз.

/**
 * Executes a program and waits for it to finish, taking pipes into account.
 * @param string $cmd Command line to execute, including any arguments.
 * @param string $input Data for standard input.
 * @param boolean $log Whether to log execution failures or not (defaults to true).
 * @return array Array of "stdout", "stderr" and "return".
 */
public static function execute($cmd,$stdin=null,$log=true){
    //static $once=true; if(!$once)die; $once=false;
    $proc=proc_open($cmd, array(
        0=>array('pipe','r'),
        1=>array('pipe','w'),
        2=>array('pipe','w')   ), $pipes);
    fwrite($pipes[0],$stdin);                fclose($pipes[0]);
    $stdout=stream_get_contents($pipes[1]);  fclose($pipes[1]);
    $stderr=stream_get_contents($pipes[2]);  fclose($pipes[2]);
    $return=proc_close($proc);
    if($return!=0 && $log)
        xlog('Error: Program execution returned failure.',$stdout,$stderr,$return);
    return array( 'stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$return );
}

Обратите внимание на закомментированную строку (строка 9). Это было для тестирования. Я включил его, чтобы целевая программа запускалась только один раз (я думал, что мой код может каким-то образом вызывать ту же функцию). PHP запускает одну и ту же команду несколько раз (в моем случае - 3 раза), даже если предполагалось, что это будет сделано только один раз.

/**
 * Executes a program and waits for it to finish, taking pipes into account.
 * @param string $cmd Command line to execute, including any arguments.
 * @param string $input Data for standard input.
 * @param boolean $log Whether to log execution failures or not (defaults to true).
 * @return array Array of "stdout", "stderr" and "return".
 */
public static function execute($cmd,$stdin=null,$log=true){
    //static $once=true; if(!$once)die; $once=false;
    $proc=proc_open($cmd, array(
        0=>array('pipe','r'),
        1=>array('pipe','w'),
        2=>array('pipe','w')   ), $pipes);
    fwrite($pipes[0],$stdin);                fclose($pipes[0]);
    $stdout=stream_get_contents($pipes[1]);  fclose($pipes[1]);
    $stderr=stream_get_contents($pipes[2]);  fclose($pipes[2]);
    $return=proc_close($proc);
    if($return!=0 && $log)
        xlog('Error: Program execution returned failure.',$stdout,$stderr,$return);
    return array( 'stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$return );
}

Обратите внимание на закомментированную строку (строка 9). Это было для тестирования. Я включил его, чтобы целевая программа запускалась только один раз (я думал, что мой код может каким-то образом вызывать ту же функцию). PHP запускает одну и ту же команду несколько раз (в моем случае 3 раза), даже если предполагалось, что это будет сделано только один раз.

/**
 * Executes a program and waits for it to finish, taking pipes into account.
 * @param string $cmd Command line to execute, including any arguments.
 * @param string $input Data for standard input.
 * @param boolean $log Whether to log execution failures or not (defaults to true).
 * @return array Array of "stdout", "stderr" and "return".
 */
public static function execute($cmd,$stdin=null,$log=true){
    //static $once=true; if(!$once)die; $once=false;
    $proc=proc_open($cmd, array(
        0=>array('pipe','r'),
        1=>array('pipe','w'),
        2=>array('pipe','w')   ), $pipes);
    fwrite($pipes[0],$stdin);                fclose($pipes[0]);
    $stdout=stream_get_contents($pipes[1]);  fclose($pipes[1]);
    $stderr=stream_get_contents($pipes[2]);  fclose($pipes[2]);
    $return=proc_close($proc);
    if($return!=0 && $log)
        xlog('Error: Program execution returned failure.',$stdout,$stderr,$return);
    return array( 'stdout'=>$stdout, 'stderr'=>$stderr, 'return'=>$return );
}

Обратите внимание на закомментированную строку (строка 9). Это было для тестирования. Я включил его, чтобы целевая программа запускалась только один раз (я думал, что мой код может каким-то образом вызывать ту же функцию). Но даже при включенной этой строке программа все равно запускалась несколько раз.

Как бы то ни было, у меня есть 2 места в моем коде, где я выполняю одну и ту же программу (в разных случаях). Командная строка одинакова для них обоих.

Однако в одном случае программа запускается один раз, а в этом случае PHP запускает программу 3 раза.

Я отслеживал и видел это поведение в разделе Обозреватель процессов. Я использую Windows 7 x64. Программа 32-битная, как и PHP.

Изменить: Данная программа разработана специально и не открывает новые процессы.

8
задан Christian 10 May 2011 в 08:05
поделиться