如何在PHP中使用passthru显示javac错误消息?

时间:2011-08-31 06:53:37

标签: java php stdout javac stderr

据我了解,PHP的passthru显示控制台的纯粹输出 - 包括所有输出,如STDERR。我正在尝试从PHP文件中获取文件,如下所示:

<?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调用的输出(更不用说-verbose)了。但是,当我访问网页时,我注意到两件事:

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

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

  3. 请注意,如果我从cmd提示符调用完全相同的命令,我会得到一大堆输出。这是怎么回事?

    TL;博士;为什么我没有得到passthru()的任何输出?

    编辑:如果我将passthru命令字符串更改为“echo PLEASEWORK”,它会正确显示输出


    出于某种原因,我无法发表评论 - Quamis,执行此cmd和捕获所有输出的首选方法是什么?

2 个答案:

答案 0 :(得分:2)

在man文件http://php.net/manual/en/function.passthru.php中,我可以清楚地看到“当Unix命令的输出是二进制数据时,应使用此函数代替exec()或system()需要直接传递回浏览器“。这意味着passthry不是你完成这项任务的最好朋友:)

这不是你的情况......

尝试使用passthru("your_command_here 2>&1")捕获stdout和stderr。

答案 1 :(得分:2)

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

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

这称为file descriptor redirection