如何捕获PHP exec发出的命令的多行输出?

时间:2013-05-15 05:11:49

标签: php exec command-line-interface

我正在尝试在PHP中执行系统命令并捕获那些输出覆盖多行的命令的输出。我正在使用exec(),但它似乎只返回一行生成输出的命令的值。

例如,如果我在命令行运行date,我会得到:

 Wed May 15 15:07:32 EST 2013

正如所料,如果我使用此函数从PHP运行此命令作为exec ...

exec("date",  $exec_results);

...然后$ exec_results的值变为......

Array ( [0] => Wed May 15 15:07:32 EST 2013 )

然而,当我从命令行运行时,我得到了这个......

real 0m0.000s
user 0m0.000s
sys  0m0.000s

...但是当我用PHP做这件事时......

exec("time",  $exec_results);

... $ exec_results的值为空:

Array( )

我实际上并不需要在我的应用程序中运行日期或时间,但这些只是命令行上单行与多行输出似乎如何改变返回PHP的示例。

文件说:

  

如果输出参数存在,那么指定的数组将被命令的每一行输出填充。

那么为什么$ exec_results数组没有被在命令行中运行time命令时看到的所有行填充?

注意 - 我已经将命令行条目作为apache用户运行以排除权限。

3 个答案:

答案 0 :(得分:9)

这应该对你有用

ob_start();
passthru("ls -la");
$dat = ob_get_clean();

答案 1 :(得分:1)

我更改了工作解决方案的帖子:

使用unix的'script'命令获取结果。 你肯定要删除临时日志文件的“额外行”。

exec('script -c "time" /tmp/yourfile.txt');
$result = file('/tmp/yourfile.txt');
var_dump($result);

您应该始终在临时文件的任何位置放置完整路径

就是这样!

答案 2 :(得分:0)

这是完整列表:

  • system() =>执行外部程序并显示输出。
  • passthru() =>与系统相同,但是将二进制“按原样”将输出从外壳强制转换为PHP输出(通常为HTTP响应)。
  • exec() =>捕获输出,仅捕获输出的最后一行到字符串中。
  • shell_exec() =>与exec相同,但捕获的是完整输出,而不仅仅是最后一行。

因此,我的偏好:始终使用shell_exec(),然后根据需要使用全字符串。

如何测试

$ php -a
Interactive mode enabled

php > echo( shell_exec( "echo hello; echo bye" ) );
hello
bye
php >

https://www.php.net/manual/en/function.shell-exec.php