Запуск java в PHP с помощью proc open() и получение выходных данных


Помогите, пожалуйста. Я не могу понять, в чем проблема с запуском java-файлов через proc_open(). Это работало в программах на C, и я смог получить вывод на строку, поэтому я думаю, что нет ничего плохого в том, чтобы получить выходной поток таким образом:

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



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

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

    }

    fclose($pipes[1]);  

Для запуска Java на PHP я использую следующие коды:

Проверка расширения, затем скомпилируйте, если java(это было успешно, так как он смог создать файл КЛАССА в том же каталог:

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);
}

Я попытался запустить эту команду в cmd окна, и она сработала (удалось запустить java и напечатать "Привет, мир"), поэтому я уверен, что в этом нет ничего плохого.

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 при выполнении java через proc_open. Я предположил, что, поскольку он использует командную строку моего окна, там не будет проблем с загрузкой библиотеки или каких-либо проблем, связанных с "версией".

В чем здесь может быть проблема? Большое вам спасибо! Я был бы признателен за любой ответ.

Author: user2800050, 2013-09-28

1 answers

О БОЖЕ. Большое спасибо сэру Михалу Рыбаку (@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

 0
Author: user2800050, 2013-09-28 13:53:24