【问题标题】:How can I display javac error messages with passthru in PHP?如何在 PHP 中使用 passthru 显示 javac 错误消息?
【发布时间】:2011-08-31 06:53:36
【问题描述】:

据我了解,PHP 的 passthru 显示控制台的纯正输出 - 包括所有输出,例如 STDERR。我正在尝试从 PHP 文件中 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 调用的输出(更不用说 -verbose)。但是,当我访问网页时,我注意到两件事:

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

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

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

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

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


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

【问题讨论】:

  • 输出到STDERR 进入 Apache 的错误日志。您需要将其重定向到 STDOUT 才能在浏览器中看到它。

标签: java php stdout javac stderr


【解决方案1】:

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

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

尝试使用passthru("your_command_here 2&gt;&amp;1") 捕获标准输出和标准错误。

【讨论】:

  • Billybob 出于某种原因无法发表评论,他在问您:“执行此 cmd 并捕获所有输出的首选方法是什么?”
  • exec("your_command_here 2&gt;&amp;1") 应该以“首选”方式解决问题
  • 这是 Billybob 的问题 ;-) 在我将他的帖子标记为非答案之前,我只是想通过他的话。
  • @Arsen7,对不起,现在我已经看到你的 cmets 了:) 奇怪的是他竟然拥有相同的头像..
  • 感谢 Quamis 和 arsen7,一有机会我会尝试的!
【解决方案2】:

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

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

这叫file descriptor redirection

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 2023-03-24
    • 1970-01-01
    • 2019-05-21
    • 2021-01-27
    • 2021-10-12
    • 2017-01-02
    相关资源
    最近更新 更多