请帮忙。我无法弄清楚通过 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,我使用以下代码:
检查扩展名,然后编译 if 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,所以不会有库加载问题或任何与“版本”相关的问题。
这里可能是什么问题?非常感谢!我将不胜感激。