使用proc_open()在PHP中运行java并获取输出

时间:2013-09-28 12:42:14

标签: java php windows cmd proc-open

请帮助。我无法弄清楚通过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);
}

enter image description here


执行该程序

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是否在执行java thru proc_open时使用了另一个java源路径。我假设因为它使用了我的Window的cmd,所以没有库加载问题或任何“版本”相关的问题。

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

1 个答案:

答案 0 :(得分:0)

OMG。非常感谢Sir Michal Rybak(@MichalRybak)帮助我找到这个解决方案。由于我无法弄清楚如何更改java版本proc_open()或PHP使用的内容,我只是编译了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