我正在尝试在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用户运行以排除权限。
答案 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 >