2011-04-09 47 views
3

对于像 'ls' 的常用命令,执行exec()正常工作,如:PHP的系统()/执行exec()不返回输出

exec('ls',$output,$retval); 
var_dump($output,$retval); 
// $output contains an array of filenames, and retval === 0 

但试图执行另一个程序时,我可以” t得到输出:

exec('some_command --a_parameter',$output,$retval); 
var_dump($output,$retval); 
// $output contains an empty array, end $retval === 0 

该命令直接从命令行执行时会打印一些行。 我知道命令已成功,因为结果(一些文件更新,数据添加等),但我看不到输出。

任何想法?

+0

您发出的命令是否实际打印输出? – Khez 2011-04-09 03:10:59

+0

它直接从命令行执行。我的意思是我可以看到屏幕上出现一些文字。也许有不同类型的输出? – HappyDeveloper 2011-04-09 03:11:59

+0

请问您正在运行的实际命令是什么? – Charles 2011-04-09 03:57:56

回答

19

这听起来像程序正在输出其警告标准错误,而不是标准输出。 exec只会捕获标准输出。我不知道标准错误总是发送到apache错误日志,但似乎很可能。

如果你不需要与非* nix系统的兼容性,您可以通过附加2>&1到命令标准错误重定向到标准输出:

exec('some_command --option 2>&1', $output, $ret); 

这都应该让现有的警告,你的php程序并防止不必要的记录。

+1

add 2>&1但输出仍然是阵列空的,如果从cmd执行,它会输出2个值 – 2014-12-10 06:19:31

+0

嗯可能是命令只在输出指向终端时输出。你想做什么? – intuited 2014-12-10 21:15:16

0

所有的输出被发送到的httpd/error_log中当一些*原因,当应用程序发现了一个警告(东西内部,即使不是致命的)

我的解决办法:当没有输出,假设它失败了。 我的apache日志会变脏,但无论如何。