如何透過 PHP 網站呼叫 Java JAR 執行結果

PHP 網站使用 Java JAR 分析結果,再回傳網站,有好幾個地雷,以下記錄供參考:

1. PHP 丟 GET 變數給 Java JAR
用 command line 方式執行 JAR 可以抓到關鍵字,但是用 PHP 網頁 exec() 執行 JAR 卻會抓不到關鍵字或抓錯傳入的變數
解決方式: 將關鍵字編碼再傳給 JAR。PHP 可以使用 json_encode 或 urlencode() 函數,在 JAR 程式碼需要實作解碼文字。基於方便後來選擇的是 urlencode() 函數。

命令列的 JAR 要用完整路徑
解決方式: 可以維持使用完整路徑,或者使用 chdir() 切換工作目錄到 JAR 所在目錄


"c:\Program Files\Java\jdk1.8.0_161\bin\java" -jar x:/path/to/some.jar 中文關鍵字

先執行 chdir ("x:/path/to/") 再執行以下指令
 "c:\Program Files\Java\jdk1.8.0_161\bin\java" -jar some.jar 編碼後中文關鍵字 

如果 PATH 已經設定好 java 則可以再省略成
java -jar some.jar 編碼後中文關鍵字 
PHP 程式語法
// change working directory
chdir("x:/path/to/");

// 取得透過 GET 傳入的關鍵字
$input_keyword = $_GET["keyword"];

// 將中文關鍵字編碼後,再傳給 JAR
$input_keyword_encoded = urlencode($input_keyword);
$command = "java -jar some.jar {$input_keyword_encoded} 2>&1";

$command = escapeshellcmd($command);

exec($command, $output);
if(is_array($output)){
    echo implode(PHP_EOL, $output);
}


2. 可以看到 JAR 檔案執行結果
解決方式: JAR 程式碼要使用 System.out.println() 函數輸出。再讓 PHP  exec()  接收執行 JAR 回傳執行結果。最後使用 AJAX 方式顯示到網頁上面。

3. 中文檔名
Windows 2008 R2 的中文檔名其實是 Big5,如果使用 UTF-8 編碼會找不到檔案
解決方式: PHP 檔名變數可使用 mb_convert_encoding() 將中文檔名從 UTF-8 轉換成 Big5

4. 可供使用者下載的中文檔名檔案
中文檔名的檔案下載遇到 404 錯誤
解決方式: 網址使用 UTF8 檔案名稱,或者將檔名 urlencode() 編碼


參考資料



留言