2013年3月28日 星期四

php-java bridge 筆記

為了在php使用weka的函式庫

最近用了一個方便的東西:PHP/Java Bridge

它的運作原理暫時還不是很了解

先筆記一下要怎麼安裝和使用

[安裝]

下載點(版本:6.2.1/2013/03/28)

下載後是一個壓縮檔,裡面有兩個檔案,documentation和JavaBridge.war(WAR file format)

建立一個資料夾JavaBridge(自己命名),將JavaBridge.war丟進去

打開cmd,cd至JavaBridge

java -classpath JavaBridge.war TestInstallation

執行完後出現兩個資料夾:ext, java
                        兩個檔案:RESULT.html, test.php

ext內有四個jar檔:JavaBridge.jar, php-script.jar, php-servlet.jar,script-api.jar

java內有一個Java.inc

滿身大汗戰戰兢兢地弄到這步後,怎麼知道成功了沒?

讓我們把焦點移至test.php

這個php檔案裡面已經有幫寫好的測試,它大致上要做的是先列出phpinfo

然後呼叫java.lang.System.getProperties()列出環境資訊

所以假設http://localhost:8080/JavaBridge/test.php有先列出phpinfo後再列出java 環境資訊大概就是成功了。

不過Ref 1中的第5點有提到 
Copy JavaBridge.jar and php-script.jar to your J2SE/Java SE ext directory ({JAVA_HOME}/jre/lib/ext).
不曉得是否為必須動作

Ref:
1. http://www.developer.com/java/other/php-with-java-using-php-java-bridge-tutorial.html
2. http://blog.wabow.com/archives/62
3. http://www.fkblog.org/blog562

[使用外部jar檔]

Ref 2中有提到
開發者似乎在version 6.0時已經將java_require( )給拿掉
所以6.0後的版本,利用java_require(weka.jar)這樣的方式會出現warning
參考Ref 1中的一個解法


  1. package your code to jar, and copy it to java.ext.dirs which you can found in JavaBridge.log
  2. copy the related class libraries to java.ext.dirs
  3. restart the service of JavaBridge
意思就是將weka.jar丟到jre的ext資料夾內然後重新啟動JavaBridge服務


Ref:
1. http://stackoverflow.com/questions/5389689/working-with-php-java-bridge
2. PHP/Java Bridge FAQ

[使用方式]

在php檔中宣告java的Instance
$s = new Java("java.lang.String", "我在php中運行java");
echo $s;


第一個參數填入欲使用類別,就像import一樣
第二個參數以後填入的是此類別Constructor的參數,
若是Constructor有一個以上的參數,目前測試的結果是依序填下去就可以


$fvNominalVal = new Java("weka.core.FastVector",2);
$fvNominalVal->addElement("yes");
$fvNominalVal->addElement("no");
//Constructor have two parameters
$Identity = new Java("weka.core.Attribute","Identity", $fvNominalVal); 

使用函式的方法要照php的方式來用
原本在java使用函式為 fvNominalVal.addElement("yes");
要改成  $fvNominalVal->addElement("yes");

將Java的Instance轉換為相對應的php value
Ref 1中提到
Use java_values() to convert a Java object into an equivalent PHP value

若要做反向的動作
Use java_closure() to convert a PHP object into an equivalent Java object.

Ref:
1. PHP/Java Bridge API

1 則留言:

  1. 想請問外部jar檔
    到底要怎麼使用
    一定要放在哪裡嗎?
    需要改什麼檔案嗎

    我php的code
    test();
    ?>

    EchoHello.java :
    package temp_test;

    public class EchoHello {
    public String test()
    {

    return "conguratulation php can call methods from java";

    }
    }
    還請告訴我
    謝謝
    我的email:pinhao1994@gmail.com

    回覆刪除