PHP StdErr после Должностного лица ()

В PHP я выполняю команду с должностным лицом (), и он возвращается если успешный URL;

$url = exec('report');

Однако я хочу проверить stderr, если что-то пошло не так, как надо. Как я считал бы поток? Я хочу использовать php://stderr, но я не уверен, как использовать его.

48
задан Makoto 27 June 2013 в 18:26
поделиться

1 ответ

Если вы хотите выполнить команду и получить оба stderr и stdout, не "слитые", решением, вероятно, будет использование proc_open, который обеспечивает большой уровень контроля над выполняемой командой - включая способ передачи stdin/stdout/stderr.

И вот пример: давайте рассмотрим, что у нас есть shell-скрипт в test.sh, который пишет и в stderr и в stdout :

#!/bin/bash

echo 'this is on stdout';
echo 'this is on stdout too';

echo 'this is on stderr' >&2;
echo 'this is on stderr too' >&2;

Теперь давайте напишем PHP в temp.php -- сначала мы инициализируем дескрипторы i/o :

$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin
   1 => array("pipe", "w"),  // stdout
   2 => array("pipe", "w"),  // stderr
);

И, затем, выполним команду test. sh, используя эти дескрипторы, в текущей директории и указав, что i/o должен быть от/до $pipes :

$process = proc_open('./test.sh', $descriptorspec, $pipes, dirname(__FILE__), null);

Теперь мы можем читать из двух выходных труб :

$stdout = stream_get_contents($pipes[1]);
fclose($pipes[1]);

$stderr = stream_get_contents($pipes[2]);
fclose($pipes[2]);

И, если мы выведем содержимое этих двух переменных :

echo "stdout : \n";
var_dump($stdout);

echo "stderr :\n";
var_dump($stderr);

Мы получим следующий результат при выполнении скрипта temp.php :

$ php ./temp.php
stdout :
string(40) "this is on stdout
this is on stdout too
"
stderr :
string(40) "this is on stderr
this is on stderr too
"
70
ответ дан 7 November 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: