在 PHP 中,exec() 函数执行命令并从命令的 stdout 返回输出。但是,如果命令写入 stderr,则 exec() 不会捕获此输出。
要从命令捕获 stdout 和 stderr,可以使用 proc_open() 函数。 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 中执行此脚本并捕获 stdout 和 stderr,您可以使用以下代码:
$descriptorspec = [ 0 => ['pipe', 'r'], // stdin 1 => ['pipe', 'w'], // stdout 2 => ['pipe', 'w'], // stderr ]; $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);
输出:
当你执行上面的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"
输出显示 test.sh 脚本中的 stdout 和 stderr 流。
以上是如何从 PHP 中的 Exec() 命令捕获 stdout 和 stderr?的详细内容。更多信息请关注PHP中文网其他相关文章!