几周前,我正在研究如何在PHP脚本中运行.jar。我遇到了一些麻烦,SELinux让事情变得复杂,但我终于解决了。
然而,我似乎并没有完全弄清楚——PHP是不一致的。我有两个jar,PHP正在调用其中一个,但没有调用另一个。
这是代码:
$command = "java -jar GA.jar ". $_SESSION['options']['GA']['popsize'] ." ". $_SESSION['options']['GA']['congens'] ." ". $filename;
echo $command;
$output = array();
exec($command, $output);
print_r($output);
exec('java -jar testJava.jar 5', $output);
print_r($output);
我让它打印出$command
,这样我就知道命令的构造是正确的。
无论如何,GA.jar没有被调用,但testJava.jar被调用了。我不明白为什么会出现这种情况。两者都在命令行中工作。两者都是用语法调用的。
我认为这可能与权限有关,但它们似乎是一样的:
-rwxr-xr-x 1 apache apache 13723 Jul 12 13:45 GA.jar
-rwxr-xr-x 1 apache apache 781 Jul 13 19:02 testJava.jar
我认为这可能与文件testfiles/PHPout
的权限有关,但GA.jar只需要从中读取,它应该有访问权限;
-rwxrwxrwx 1 apache apache 189 Jul 16 15:46 testfiles/PHPout
如果您想知道实际输出是什么,$output
包含testJava.jar的预期输出,但GA.jar中的输出完全为空。
在阻止PHP调用GA.jar但允许testJava.jar的过程中,还可能涉及哪些因素?
(记录在案,这是在一台运行Redhat和Apache服务器的机器上。)
尝试将2>&1
添加到命令末尾,以将错误输出重定向到$output
变量,并查看是否得到任何结果。
也可以试试system
或passthru
,看看它是否有什么不同。
我已经弄清楚问题出在哪里了。我问这个问题为时过早,我没有尽我所能来诊断这个问题。jar在很早的时候就执行了一些fortran代码。出于某种原因,正确执行fortran代码的能力会受到执行.jar的使用方式的影响——因此,当作为我自己的用户从命令行运行时,它运行得很好,但当作为apache从PHP运行时,遇到了麻烦。