Exec()后的PHP StdErr
在PHP中,我使用exec()执行一个命令,如果URL成功,它将返回;
$url = exec('report');
但是,如果出现问题,我想检查stderr。 我将如何阅读stream? 我想要使用php:// stderr,但我不知道如何使用它。
如果你想要执行一个命令,同时得到stderr
和stdout
,而不是“合并”,一个解决scheme可能会使用proc_open
,它提供了一个很好的控制正在执行的命令 – 包括一种方式pipe道stdin
/ stdout
/ stderr
。
下面是一个例子:让我们考虑一下在test.sh
有这个shell脚本,它写入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;
现在,让我们在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);