【问题标题】:PHP exec Java on Windows produces no outputWindows 上的 PHP exec Java 不产生输出
【发布时间】:2012-09-10 21:02:47
【问题描述】:

我已经阅读了很多关于我的问题的类似 SO 问题,但似乎都没有我的问题。如果相关,我在 Apache 2.2 上运行 PHP 5.3.8 并且 PHP exec() 运行为 nt authority\system

$cmd = "java -version";
$res = exec($cmd, $output, $return);

var_dump($res, $output, $return);

生产:

string '' (length=0)

array
    empty

int 0

$return 为 0 表示这是成功的。有趣的是,如果我运行:

$cmd = "java -version 2> response";

使用预期输出创建一个文件:

java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)

所以我的问题是:为什么$output 没有被填充?

评论更新

$res = exec("dir c:", $output, $return);的结果

string '               2 Dir(s)  335,636,791,296 bytes free' (length=51)

array
    0 => string ' Volume in drive C is Local Disk' (length=32)
    1 => string ' Volume Serial Number is D87C-E25C' (length=34)
    2 => string '' (length=0)
    ...
    12 => string '               5 File(s)          1,158 bytes' (length=45)
    13 => string '               2 Dir(s)  335,636,791,296 bytes free' (length=51)

int 0

【问题讨论】:

  • 请检查我的更新答案,希望它会为你解决它

标签: php exec


【解决方案1】:

试试这个

$output = `java -version 2>&1`

注意命令周围的反引号,它与 shell 命令完全一样

2>&1 应该将错误重定向到标准输出,因为 java 默认使用标准错误!

【讨论】:

  • 试过 $output 只是null
  • 你能试试像`dir c:`这样的东西
  • 编辑了输出的主要问题 - 一切正常 - 执行没有问题
【解决方案2】:

您似乎将苹果与橙子进行比较,因为在第二个示例中您重定向了 stderr 流,而在第一种情况下您不这样做。我建议在使用 exec 之类的调用时始终将 stderr 重定向到 stdout,否则您将丢失此输出

【讨论】:

  • 但是为什么输出到stderr?根据 PHP,命令执行成功 - 注意 $return = 0
【解决方案3】:

虽然不是“答案” - 我最终做的是将所有输出重定向到 STDOUT 并检查 $return 是否为 0。

这可能与this bug 有关,即使我运行的是 5.3,它似乎也符合我的场景

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2014-04-10
    • 2014-02-10
    相关资源
    最近更新 更多