為了在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中的一個解法
- package your code to jar, and copy it to java.ext.dirs which you can found in JavaBridge.log
- copy the related class libraries to java.ext.dirs
- 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