Exec()后的PHP StdErr

在PHP中,我使用exec()执行一个命令,如果URL成功,它将返回;

$url = exec('report'); 

但是,如果出现问题,我想检查stderr。 我将如何阅读stream? 我想要使​​用php:// stderr,但我不知道如何使用它。

如果你想要执行一个命令,同时得到stderrstdout ,而不是“合并”,一个解决scheme可能会使用proc_open ,它提供了一个很好的控制正在执行的命令 – 包括一种方式pipe道stdin / stdout / stderr

下面是一个例子:让我们考虑一下在test.sh有这个shell脚本,它写入stderrstdout

 #!/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; 

现在,让我们在temp.php编写一些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); 

我们现在可以从两个输出pipe道读取:

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

而且,如果我们输出这两个variables的内容:

 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 " 

希望这可以帮助 :-)

一些可能有用的function:

 function my_shell_exec($cmd, &$stdout=null, &$stderr=null) { $proc = proc_open($cmd,[ 1 => ['pipe','w'], 2 => ['pipe','w'], ],$pipes); $stdout = stream_get_contents($pipes[1]); fclose($pipes[1]); $stderr = stream_get_contents($pipes[2]); fclose($pipes[2]); return proc_close($proc); } 

退出代码返回,STDOUT和STDERR是参考参数,如果你需要它们。

另一种方法得到未装入标准输出/标准错误。

 $pp_name = "/tmp/pp_test"; @unlink($pp_name); posix_mkfifo($pp_name, 0777); $pp = fopen($pp_name, "r+"); stream_set_blocking($pp, FALSE); exec("wget -O - http://www.youtube.com 2>$pp_name", $r_stdout); $r_stderr = stream_get_contents($pp); var_dump($r_stderr); fclose($pp); unlink($pp_name); 

如果你想忽略标准输出,只得到标准错误,你可以试试这个:

 exec("wget -O - http://www.youtube.com 2>&1 >/dev/null", $r_stderr);