最新的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,也正如此我不得不和客户商量其它的解决办法。
也希望有知道原因的朋友能给一些提示!