9

我正在尝试在 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 从 PHP 中执行此操作时...

exec("time",  $exec_results);

... $exec_results 的值为空:

Array( )

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

文件说:

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

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

注释 - 我以 apache 用户身份运行命令行条目以排除特权。

4

3 回答 3

10

这应该适合你

ob_start();
passthru("ls -la");
$dat = ob_get_clean();
于 2013-05-15T05:34:43.577 回答
2

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

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

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

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

而已 !

于 2013-05-15T05:25:50.320 回答
2

所以这里是完整的列表:

  • system()=> 执行一个外部程序并显示输出。
  • passthru()=> 与系统相同,但将二进制“原样”的输出从 shell 转换为 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

于 2019-05-06T21:57:08.773 回答