【问题标题】:Running java in PHP using proc_open() and getting the output使用 proc_open() 在 PHP 中运行 java 并获取输出
【发布时间】:2013-09-28 12:42:13
【问题描述】:

请帮忙。我无法弄清楚通过 proc_open() 运行 java 文件的问题是什么。它适用于 C 程序,我能够获得每行的输出,所以我认为以这种方式获取输出流没有任何问题:

$ctr = 0;
$score_ctr = 0;
$out2 = "";



    while (!feof($pipes[1])) {

     $out2[$ctr]= fgets($pipes[1]);
     $ctr++;

    }

    fclose($pipes[1]);  

为了在 PHP 中运行 Java,我使用这些代码:

检查扩展名,如果是java则编译(这很成功,因为它能够在同一目录中生成CLASS文件:

if($ext == "java" || $ext =="JAVA"){ //case for java
        exec('cd \xampp\htdocs\ci_user\uploads & javac '.$file);
}


要执行程序,

if($ext == "java" || $ext =="JAVA"){ //case for java

    //Removes '.java' extension for cmd
    $name2 = preg_replace("/\\.[^.\\s]{3,4}$/", "", $name);

   //Command to be executed
    $p = 'cd \xampp\htdocs\ci_user\uploads & java '.$name2;


    $process = proc_open($p, $descriptorspec, $pipes);
}

我已经尝试在 Window 的 cmd 中运行此命令,并且它有效(能够运行 java 并打印“Hello, World”),所以我确信它没有任何问题。

cd \xampp\htdocs\ci_user\uploads & java HelloWorld

我的错误日志文件中出现此错误:

        java.lang.UnsupportedClassVersionError: HelloWorld : Unsupported major.minor version 51.0
            at java.lang.ClassLoader.defineClass1(Native Method)
            at java.lang.ClassLoader.defineClassCond(Unknown Source)
            at java.lang.ClassLoader.defineClass(Unknown Source)
            at java.security.SecureClassLoader.defineClass(Unknown Source)
            at java.net.URLClassLoader.defineClass(Unknown Source)
            at java.net.URLClassLoader.access$000(Unknown Source)
            at java.net.URLClassLoader$1.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
            at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
            at java.lang.ClassLoader.loadClass(Unknown Source)
        Could not find the main class: HelloWorld.  Program will exit.

我不知道 PHP 在通过 proc_open 执行 java 时是否使用了另一个 java 源路径。我假设因为它使用的是我的 Window 的 cmd,所以不会有库加载问题或任何“版本”相关问题。

这可能是什么问题?非常感谢!如有任何回复,我将不胜感激。

【问题讨论】:

  • 你的 Java 版本是多少?
  • @MichałRybak java version "1.7.0_07" Java(TM) SE Runtime Environment (build 1.7.0_07-b11) Java HotSpot(TM) 64-Bit Server VM (build 23.3-b01, mixed mode )
  • 还有 javac 版本?您的问题可能与您的 JRE 版本和您的类文件不兼容有关。 more here
  • 如果它在 Windows cmd 中工作,您可能需要检查在 PHP 中哪个文件被用作“java”,使用 readlink -f java
  • @MichałRybak 好的,先生。我现在正在检查它。感谢您的指导。

标签: java php windows cmd proc-open


【解决方案1】:

天哪。非常感谢 Michal Rybak 爵士 (@MichalRybak) 帮助我找到了这个解决方案。由于我不知道如何更改 proc_open() 或 PHP 使用的 java 版本,我只是编译了 java 程序并使类与 低版本兼容。

我更改了这段代码:

exec('cd \xampp\htdocs\ci_user\uploads & javac '.$file);

这个

exec('cd \xampp\htdocs\ci_user\uploads & javac -source 1.4 -Xlint:-options '.$file);

非常感谢!!!!!!!!!!先生,您真的帮了我很多忙! :D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多