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

如何捕获PHP exec发出的命令的多行输出?,php,exec,command-line-interface,Php,Exec,Command Line Interface,我试图在PHP中执行系统命令,并在这些命令的输出包含多行的情况下捕获这些命令的输出。我使用的是exec(),但它似乎只为在单行上生成输出的命令返回一个值 例如,如果在命令行中运行date,则会得到: Wed May 15 15:07:32 EST 2013 正如所料,如果我以exec的身份从PHP运行这个命令,使用这个 exec("date", $exec_results); …然后$exec_results的值变为 Array ( [0] => Wed May 15 15:07:

我试图在PHP中执行系统命令,并在这些命令的输出包含多行的情况下捕获这些命令的输出。我使用的是exec(),但它似乎只为在单行上生成输出的命令返回一个值

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

 Wed May 15 15:07:32 EST 2013
正如所料,如果我以exec的身份从PHP运行这个命令,使用这个

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用户的身份运行命令行条目以排除特权。

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

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

exec('script -c "time" /tmp/yourfile.txt');
$result = file('/tmp/yourfile.txt');
var_dump($result);
您应该始终将临时文件的完整路径放在任何位置


就这样

这应该适合你

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

下面是完整的列表:

  • system()
    =>执行外部程序并显示输出
  • passthru()
    =>与系统相同,但将二进制输出“按原样”从shell强制转换为PHP输出(通常是HTTP响应)
  • exec()
    =>将输出和输出的最后一行捕获为字符串
  • shell_exec()
    =>与exec相同,但捕获完整输出,而不仅仅是最后一行
因此,我的偏好是:始终使用
shell\u exec()
,然后根据需要处理整个字符串

如何测试

感谢您的想法-我尝试了shell_exec,但不幸的是,对于CLI输出不止一行的命令,它也不会向PHP返回任何内容。仍然困惑…请小心,实际上cron和write to file的问题与PHP的问题完全相同,如果命令不写入控制台,则重定向程序无法捕获它:#time>file.txt不会将结果放入文件eitherThanks Ph.T-你是对的,这在时间内不起作用。不过,它确实对Dell OMSA应用程序的命令有效(这是我想在PHP中捕获的)。所以在那个例子中,屏幕上打印的内容可以移动到文件中,但是PHP仍然得到一个空数组。我的变通方法是可行的,但遗憾的是,我们无法找出PHP为什么能够获取文本……嗨,丹,我更改了帖子,使它甚至可以通过“script”命令使用“time”unix命令。它也使用临时文件。EnjoyThank-这对“ls-la”有效,但对时间无效,也不适用于我试图捕获的Dell OMSA程序的多行输出。不知道有什么区别。。。我会继续研究的。谢谢您确定这些命令正在写入stdout而未进行stderrI检查吗?使用exec()的第三个参数时没有错误,因此这意味着输出将作为stdout出现,尽管对于@Ph.t来说,输出可能只是屏幕而已。我找到了另一个解决方案,让CRON作业运行命令并将数据放入文件中。PHP将只查找文件。
$ php -a
Interactive mode enabled

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