2012-07-16 91 views
-1

几个星期前我正在弄清楚如何在PHP脚本中运行.jar。我遇到了一些麻烦,SELinux使事情变得复杂,但我终于明白了。PHP exec()不调用.jar

但是,看起来我并没有明白 - PHP是不一致的。我有两个罐子,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 IS。我无法弄清楚为什么会出现这种情况。两者都从命令行工作。两者都被调用语法。

我认为它可能有一些做的权限,但他们似乎是相同的:

-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?

(根据记录,这是运行红帽与Apache服务器的计算机上。)

+0

也许它与你传递给GA.jar的参数有关。尝试注释掉代码来执行第二个jar,并简化代码以运行第一个代码。 – Tucker 2012-07-16 22:04:33

+0

这不是参数 - 正如我所说的,完全相同的命令在命令行上工作。 – MattS 2012-07-16 22:06:04

+0

你可以试试'$ command =“java -jar GA.jar”。 escapeshellarg($ _ SESSION ['options'] ['GA'] ['popsize'])。 “”。 escapeshellarg($ _ SESSION ['options'] ['GA'] ['congens'])。 “”。 escapeshellarg($ filename)。 “2> &1"; exec($ command,$ output,$ code); var_dump($ command,$ output,$ code);'并且输出你得到的输出? – DaveRandom 2012-07-16 22:24:20

回答

0

我已经想出了问题所在。我提出问题还为时过早,我没有做任何事情来诊断问题。 .jar很早就执行了一些Fortran代码。出于某种原因,正确执行fortran代码的能力受到哪个用户执行.jar的影响 - 所以当从命令行运行时,作为我自己的用户,它运行良好,但是从PHP运行时,它运行的是Apache陷入麻烦。

1

尝试增加2>&1到命令的末尾错误输出重定向到$output变量,看看你会得到什么。

也试试systempassthru看看它是否有任何区别。

+0

它不会产生任何错误输出系统和passthru什么都不做 – MattS 2012-07-17 02:00:43

+0

@MattS你能给我发送jar文件吗? – Petah 2012-07-17 02:09:45

+0

不幸的是,这是我正在为工作而工作的东西,和虽然。jar完全是我自己制作的,它有需要访问才能运行的受版权保护的数据,我无法将它发送给你。 – MattS 2012-07-17 02:30:03