【问题标题】:php shell_exec("java -version") returning nullphp shell_exec("java -version") 返回空值
【发布时间】:2013-07-07 14:12:32
【问题描述】:

我正在使用命令:

shell_exec("java -version");

检测所安装的 Java 版本。已安装 Java。 PHP 脚本在用户“daemon”下运行。从命令行运行此命令:

su daemon -c 'java -version'

输出

java version "1.6.0_27"
OpenJDK Runtime Environment (IcedTea6 1.12.1) (6b27-1.12.1-2ubuntu0.12.04.2)
OpenJDK Client VM (build 20.0-b12, mixed mode, sharing)

我知道使用 shell_exec 可以与 Java 和 PHP 一起使用,因为在代码的其他地方我正在使用它运行 java .jar 文件。

我错过了什么吗?

【问题讨论】:

  • 运行 php 脚本的进程很可能确实定义了不同的 PATH。该变量通常在 shell 启动脚本中定义,这可能会有所不同。尝试使用绝对路径解决 java 可执行文件。
  • 你可以在命令行输入which java找到绝对路径。
  • 是的,我同意路径可能是罪魁祸首。另外,请考虑其他环境变量,例如 HOME - 我之前使用过 encountered that problem
  • 我认为,根据我在下面的回答,PATH 和其他环境变量不是问题,因为 shell 行为使用了 exec_shell 模拟的反引号。
  • @arkascha - 但在代码的其他地方我正在运行“java file.jar”,它运行 file.jar 就好了。另外,我将命令行中的“which java”作为 root 和代码中的 print 语句进行了比较,它们是相同的:/usr/bin/java

标签: java php linux


【解决方案1】:

2>&1 添加到您的shell 命令的末尾以返回STDERR 以及STDOUT

$output = shell_exec("java -version 2>&1");

【讨论】:

    【解决方案2】:

    试试这个 - exec('java -version', $output);

    这是 exec() 而不是 shell_exec()

    More detail here

    【讨论】:

    • exec('java -version', $output) 返回一个空数组
    • 你也试过这个吗?
    【解决方案3】:

    看起来 Java 正在将输出直接发送到标准输出。如果您在命令行上运行带有反引号的命令(正如documentation 所说的命令等效),并尝试将其存储在变量中,您会看到它被打印出来,但没有存储在变量中。

    例如:

    foo=`java -version`
    print $foo // results in nothing
    

    但是:

    foo=`ls`
    print $foo // results in the results of ls
    

    您可以尝试将exec 与输出变量一起使用。

    【讨论】:

      猜你喜欢
      • 2016-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多