2011-08-31 104 views
2

据我了解,PHP的passthru显示控制台的纯粹输出 - 包括所有输出,如STDERR。我试图从一个PHP文件的javac文件像这样:如何在PHP中使用passthru显示javac错误消息?

<?php 
error_reporting(E_ALL); 

    if(file_put_contents("code.java", "aaaaaa")) 
    { 
     passthru("javac -verbose code.java"); 
     echo("Done."); 
    } 
    else 
    { 
     echo("UNEXPECTED PHP ERROR"); 
    } 
?> 

正如你可能已经猜到,“AAAAAAA”不应该编译 - 这我期望从javac的呼叫(而不是输出提 - 详细)。然而,当我访问网页时,我注意到两两件事:

  1. code.java成功创建并充满我指定的数据。

  2. 该网页的唯一输出是“完成”。

请注意,如果我从cmd提示符调用完全相同的命令,我会得到一整个输出。这里发生了什么?

tl; dr;为什么我没有从passthru()获得任何输出?

编辑:如果我改变中继命令字符串“回声PLEASEWORK”它正确


显示输出,出于某种原因,我不能发表评论 - Quamis,什么是执行这个CMD的首选方法并捕获所有输出?

+2

输出到'STDERR'去Apache的错误日志。您需要将其重定向到'STDOUT'以在浏览器中查看它。 –

回答

2

在人文件http://php.net/manual/en/function.passthru.php我可以清楚地读出“此功能应该在适当位置执行exec()或系统()一起使用时从Unix命令的输出是需要回直接传递给二进制数据浏览器”。这意味着passthry是不是这个任务:)

这不是你的情况你最好的朋友......

尝试使用passthru("your_command_here 2>&1")捕捉到标准输出和标准错误。

+0

Billybob出于某种原因无法发表评论,他问你:“执行此cmd并捕获所有输出的首选方法是什么?” – Arsen7

+0

@ Arsen7:使用'exec()' – Quamis

+0

'exec(“your_command_here 2>&1”)'应该以“首选”的方式来诀窍 – Quamis

2

如前所述,输出到STDERR去Apache的日志文件。 “看到”它在浏览器中,你需要将其重定向到STDOUT

$command = "javac -verbose code.java 2>&1"; 
$result = passthru($command); 

这就是所谓的file descriptor redirection