PHP通過php-java-bridge調用JAVA的jar包里class類


正 文:

 

有的時候我們需要在PHP里調用JAVA平台封裝好的jar包里的class類和方法,一般飄易推薦的做法是采用php-java-bridge做橋接,本文就來介紹一下大致的實現方法。

 

先簡單說下php-java-bridge做橋接的實現原理

先打開java的一個監聽端口,php調用java的時候,將對應的方法調用轉發到java的指定端口,由java執行后再將結果返回給php。這種模式是一種比較典型的代理模式,php在這里成為了一個代理轉發器,把java的類調用轉發給后端的java執行。

 

我們再來看看具體的流程

1、下載二進制的 JavaBridge.jar包、java/Java.inc庫文件,下載地址:http://php-java-bridge.sourceforge.net/pjb/download.php

注意,當前最新版本是PHP/Java Bridge 6.2.1,但是這個版本也是2010-10-31更新的,現在都2016年了,都過去6年了,從這個更新日期來看,源碼編譯安裝的方式只適合在此日期之前發布的PHP版本,比如PHP 5.3.3發布日期是2010-7-22,但是保守估計,源碼編譯安裝的方式僅適合PHP 5.2以及更低的PHP版本,不適合PHP 5.3/PHP 5.4/PHP 5.5/PHP 5.6/PHP 7這些高版本的PHP了,源碼編譯最高只支持到PHP5.2。飄易這里不采用源碼安裝的方式,直接使用二進制包打開監聽端口就可以了。

 

2、linux下安裝java環境,具體安裝方法就不說了,搜索下;飄易使用的是java-1.7,留意下環境配置:

文件 /etc/profile 末尾添加:

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

然后,source /etc/profile 使之立即生效。

PS: 如何找到java安裝路徑呢?

3、將JAVA的jar包文件放置在java的庫位置 $JAVA_HOME/jre/lib/ext/,如

/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64/jre/lib/ext/app-security.jar

 

4、在JavaBridge.jar所在目錄運行命令(先cd到所在目錄) 

java -jar JavaBridge.jar SERVLET_LOCAL:8081 &

(加&是讓其在后台運行)

或者直接帶上日志等級

java -jar JavaBridge.jar SERVLET:8081 3 JavaBridge.log &

執行后,我們使用命令netstat -nltp,發現linux已經開啟了一個8081端口開始監聽:

 

PS:如果需要開機啟用,配置:

/etc/rc.local 添加開機啟動

java -jar JavaBridge.jar所在絕對路徑 SERVLET_LOCAL:8081 &

 

5、在web目錄下放置 Java.inc文件,編寫php測試代碼 test.php

<?php header( 'Content-Type: text/html; charset=UTF-8' );

define("JAVA_DEBUG", true); //調試設置
define("JAVA_HOSTS", "127.0.0.1:8081"); //設置javabridge監聽端口
/*0: Log nothing, not even fatal errors.
  1: Log fatal system errors such as "out of memory error".
  2: Log java exceptions.*/
define("JAVA_LOG_LEVEL", 2); //java.log_level: 0-6

require_once "Java.inc"; //php調用java的接口,與該腳本位於同一目錄
java_set_file_encoding("UTF-8"); //設置JAVA編碼。

try {
  /* invoke java.lang.System.getProperties() */
  $props = java("java.lang.System")->getProperties();
  
  /* convert the result object into a PHP array */
  $array = java_values($props);
  foreach($array as $k=>$v) {
    echo "$k=>$v"; echo "<br>\n";
  }
  echo "<br>\n";
  
  /* create a PHP class which implements the Java toString() method */
  class MyClass {
    function toString() { return "hello PHP from Java!"; }
  }
  
  /* create a Java object from the PHP object */
  $javaObject = java_closure(new MyClass());
  echo "PHP says that Java says: "; echo $javaObject;  echo "<br>\n";
  echo "<br>\n";

  echo java("php.java.bridge.Util")->VERSION; echo "<br>\n";

} catch (JavaException $ex) {
  echo "An exception occured: "; echo $ex; echo "<br>\n";
}

 

6、PHP如何調用自己編寫的java類呢?

$Des3 = new Java("com.ksoft.security.Des3"); //實例
try{    
    echo $Des3->encode('88290801', $key);
    echo "<hr>";
    echo $Des3->decode('S2JFP23v0zM=', $key);
}
catch(Exception $e) {
    echo($e);
}

 

【一些注意事項】:

關於PHP-Java-Bridge的各種函數使用:

1、高版本的java_require不再使用,也無法使用,由於放到java虛擬機下面,則不需要再手動引入包文件。

2、java_value()用於獲取值,而且必須使用該函數獲取值。

(特別注意:如果該值需要存入數據庫,那么必須使用該java_value函數,不然會報錯,或者無法存入數據庫)

3、java_inspect()對實例化或者方法進行print_r類似的輸出。

(注:請不要直接使用var_dump這樣的輸出方法輸出java的類、方法、變量,需要使用java_inspect或者java_value,例如:var_dump(java_inspect($abc)))

4、實例化使用 $test = new Java("Test")的方式,如果實例化的方法中存在參數,可以這樣new Java("Test","pram")

 

提醒

1、務必確保對java.inc的引用,確保引用正確

2、務必確保對jar包放在能引用的地方,比如java虛擬機jre下面

3、在PHP中調用Java使用PHP的的寫法即可

 

【參考】:

1、PHP-Java-Bridge使用筆記

2、PHP-Java-Bridge的使用(平安銀行支付功能專版)

3、使用php-java-bridge讓PHP5支持java

4、Linux下配置php-java-bridge

 

 引用自 http://www.piaoyi.org/php/php-java-bridge-jar-class.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM