2013-05-15 158 views
3

我想在PHP中执行系统命令,并捕获那些输出涵盖多行的那些命令的输出。我正在使用exec(),但它似乎只为单行生成输出的命令返回一个值。如何捕获PHP执行的命令的多行输出?

例如,如果我在命令行中运行日期,我得到:

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用户来排除特权。

回答

1

我改变了我的职位工作的解决方案:

使用UNIX的“脚本”命令来获得结果。 您肯定必须删除临时日志文件的“额外行数”。

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

你应该总是把一个完整路径临时文件,任何地方,你把它

这就是它!

+0

感谢您的想法 - 我试过了shell_exec但不幸的是发现它也没有返回到PHP对于其中CLI输出多行的命令。仍然困惑... – Dan

+0

要小心,实际上与cron和写入文件的问题是完全一样的问题,如果该命令不写入控制台它不能被重定向器捕获:#time> file.txt将不会把结果写入文件 –

+0

谢谢Ph.T - 你是对的,不适合时间。它确实适用于戴尔OMSA应用程序的命令(这是我想用PHP捕获的)。所以在这个例子中,屏幕上显示的内容可以移动到文件中,但PHP仍然只是获得一个空数组。我的解决方法是有效的,但是我们无法找到为什么PHP能够获取文本是一种遗憾...... – Dan

7

这应该为你工作

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

谢谢 - 这对'ls -la'有效,但不是时间,或者我试图捕获的Dell OMSA程序的多线输出。不知道有什么区别...我会继续研究。谢谢! – Dan

+0

你确定这些命令写入标准输出,而不是stderr – Orangepill

+0

我检查了没有错误使用exec()的第三个参数,所以这应该意味着输出作为标准输出,尽管@ Ph.T的也许是输出只有屏幕。通过让CRON作业运行命令并将数据放入文件中,我找到了另一种解决方案。 PHP只会查找文件。 – Dan