PHP StdErr after Exec()
在PHP中,我正在使用exec()执行命令,如果成功,它将返回URL;
$url = exec('report');
但是,我想检查stderr,如果出现问题。如何阅读直播?我想使用 php://stderr,但我不确定如何使用它。
在PHP中,我正在使用exec()执行命令,如果成功,它将返回URL;
$url = exec('report');
但是,我想检查stderr,如果出现问题。如何阅读直播?我想使用 php://stderr,但我不确定如何使用它。
如果你想执行一个命令,并且同时获得 和 ,而不是“合并”,解决方案可能会使用proc_open
,它可以很好地控制正在执行的命令 - 包括管道 // 的方法。stderr
stdout
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代码,首先,我们初始化i / o描述符:temp.php
$descriptorspec = array(
0 => array("pipe", "r"), // stdin
1 => array("pipe", "w"), // stdout
2 => array("pipe", "w"), // stderr
);
然后,在当前目录中使用这些描述符执行命令,并说i / o应该是从/到:test.sh
$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
"
一个可能有用的小函数:
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 是引用参数。