jinyong

平淡生活,努力工作

导航

最新的PHP java bridge使用方法和遇到的问题

最新的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,也正如此我不得不和客户商量其它的解决办法。

也希望有知道原因的朋友能给一些提示!

posted on 2007-03-27 19:08  jy_kwwl  阅读(4260)  评论(13编辑  收藏  举报