2012-07-16 46 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