最新的PHP java bridge使用方法和遇到的問題
在PHP中調用Java組件,在我對PHP的學習一開始就給我出了一個難題。google裡一搜,介紹的文章還不少,大體上看來,有兩種方法可以解決這個問題:1、使用php_java.dll擴充;2、使用PHP java bridge。
第一種方法不多說,修改php.ini,重啟Apache似乎一切順利,但是只要頁面執行到調用java的地方,apache就彈出記憶體不能為read的錯誤,再找了找其它的資料,說把php.ini裡的memory_limi設大些就解決了,可是直到設定為512M的時候,仍然出現相同的問題。沒轍,只好採用第二種方法。
到sf.net上下載了php-java-bridge_4.0.3_j2ee.zip,可是問題又來了,網上的資料上都是3.0版本的,而且說裡面有個java-x86-windows.dll,可是現在的4.0包裡並沒有,最要命的還是E文太差,裡面的說明文檔又看不懂,那怎麼辦,只能摸著石頭過河了,每種配置方法都試著去弄,仍然不能正常運行,還是只能硬著頭皮去看說明文檔。
原來,它要先把JavaBridge.war解壓開,在JavaBridge\WEB-INF\lib裡有個JavaBridge.jar檔案,命令列下調用java –jar JavaBridge.jar或者雙擊JavaBridge.jar,在彈出的視窗中選擇監聽連接埠。(這裡要說明一下,安裝Apache的時候最好弄成使用 80連接埠,而JavaBridge讓它使用8080連接埠,這樣省得倒處去搞配置,如果您的Apache是使用 8080連接埠,那麼JavaBridge就只能使用其它連接埠,並且java/Options.inc裡需要修改JavaBridge的連接埠。)
將JavaBridge裡的java這個檔案夾整個的複製到PHP目錄中,然後加上如下代碼:
require_once("java/java.inc");
try {
$system = new Java('java.lang.System');
// demonstrate property access
echo 'Java version=' . $system->getProperty('java.version') . '<br/>';
echo 'Java vendor=' . $system->getProperty('java.vendor') . '<br/>';
echo 'OS=' . $system->getProperty('os.name') . ' ' .
$system->getProperty('os.version') . ' on ' .
$system->getProperty('os.arch') . ' <br/>';
}
catch (JavaException $e)
{
echo $e->getCause();
}
,IE中重新整理頁面,可以看到以下運行結果:
Java version=1.6.0
Java vendor=Sun Microsystems Inc.
OS=Windows XP 5.1 on x86。
在這種情況,運行是很正常的,但是我是需要調用自己的組件的,加上一行代碼,
require_once("java/java.inc");
$system = new Java('java.lang.System');
java_require("C:\\AppServ\\www\\test\\EUCPCommHTTP.jar");
try {
$system = new Java('java.lang.System');
// demonstrate property access
echo 'Java version=' . $system->getProperty('java.version') . '<br/>';
echo 'Java vendor=' . $system->getProperty('java.vendor') . '<br/>';
echo 'OS=' . $system->getProperty('os.name') . ' ' .
$system->getProperty('os.version') . ' on ' .
$system->getProperty('os.arch') . ' <br/>';
}
catch (JavaException $e)
{
echo $e->getCause();
}
重新整理頁面時出現:
[[o:IllegalStateException]:"java.lang.IllegalStateException: java_require() not allowed for the HTTP tunnel. Use a context runner instead." at: #-7 php.java.bridge.JavaBridgeClassLoader.checkCl(JavaBridgeClassLoader.java:55) #-6 php.java.bridge.SimpleJavaBridgeClassLoader.forName(SimpleJavaBridgeClassLoader.java:187) #-5 php.java.bridge.JavaBridge.CreateObject(JavaBridge.java:514) #0 C:\AppServ\www\test\JavaBridge\java\Java.inc(151): java_ExceptionProxyFactory->getProxy(2, true) #1 C:\AppServ\www\test\JavaBridge\java\Java.inc(304): java_Arg->getResult(true) #2 C:\AppServ\www\test\JavaBridge\java\Java.inc(310): java_Client->getWrappedResult(true) #3 C:\AppServ\www\test\JavaBridge\java\Java.inc(489): java_Client->getResult() #4 C:\AppServ\www\test\JavaBridge\java\Java.inc(735): java_Client->invokeMethod(1, 'getCause', Array) #5 C:\AppServ\www\test\JavaBridge\java\Java.inc(956): java_JavaProxy->__call('getCause', Array) #6 [internal function]: java_exception->__call('getCause', Array) #7 C:\AppServ\www\test\smsTest.php(39): java_InternalException->getCause() #8 {main}]
再重新整理一次則又正常,問題交替出現。
至此,也再沒有任何進展,這也許本來就是PHP java bridge的一個BUG,也正如此我不得不和客戶商量其它的解決辦法。
也希望有知道原因的朋友能給一些提示!