2012-02-27 64 views
5

我試圖執行一個java程序簽署與PHP的exec功能的PDF文件,但不工作:不能用PHP執行函數執行java程序

exec('java -jar PROGRAM.jar -n -t ORIGIN.pdf -o DESTINY.pdf -s CERTIFICATE -p PASSWORD', $output, $return); 

當我執行它時, $輸出是一個空數組和$返回是一個int(1),但如果我運行:

java -jar PROGRAM.jar -n -t ORIGIN.pdf -o DESTINY.pdf -s CERTIFICATE -p PASSWORD 

在命令行它的工作原理。誰能幫我?

謝謝。

+3

是否如果你工作提供java二進制文件的完整路徑?例如'/ usr/bin/java'。使用'which java'來查找二進制文件的路徑。 – Treffynnon 2012-02-27 15:38:57

+1

除了@Treffynoon的評論,您可能還需要指定PROGRAM.jar,ORIGIN.pdf和DESTINY.pdf文件的完整路徑 – 2012-02-27 15:48:27

+0

我只是使用文件和命令的完整路徑,並且不起作用。 – josebailo 2012-02-27 17:01:26

回答

1

最後我可以解決這個問題。

解決的辦法是:

exec('java -Djava.awt.headless=true -jar PROGRAM.jar -n -t ORIGIN.pdf -o DESTINY.pdf -s CERTIFICATE -p PASSWORD', $output, $return); 

添加-Djava.awt.headless=true選項你告訴java的,它是一個間接調用,因此還沒有過鍵盤,鼠標控制等

+0

嗨,這不適合我,我試着上面的代碼,我仍然得到一個空數組的結果 – 2014-04-11 13:07:26

3

@Treffynnon是對的。從命令提示符和其他程序執行程序之間的區別是環境變量和權限。

因此,首先檢查運行PHP的用戶是否有權運行應用程序並訪問相應的文件。

然後路徑驗證到

  1. 的Java
  2. PROGRAM.jar
  3. ORIGIN.pdf
  4. DESTINY.pdf

你或許應該修改路徑,即更好的指定它使用相對或絕對符號。這是因爲當前的工作目錄可能會有兩種情況。

祝你好運。

2

幾乎可以肯定PHP不會知道「java」的路徑。如果你使用的是Linux,運行「which java」,然後把你回來的整個java路徑放到exec調用中,例如

exec('/usr/bin/java -jar PROGRAM.jar -n -t ORIGIN.pdf -o DESTINY.pdf -s CERTIFICATE -p PASSWORD', $output, $return);