有的时候我们需要在PHP里调用JAVA平台封装好的jar包里的class类和方法
一般的做法是采用php-java-bridge做桥接
1.实现原理:
先打开java的一个监听端口,php调用java的时候,将对应的方法调用转发到java的指定端口,由java执行后再将结果返回给php
Java BridgeWeb应用程序包含库php-servlet.jar和php-script.jar
php-servlet.jar包含两个servlet
(1)PhpJavaServlet处理来自在Apache / IIS或命令行中运行的远程PHP脚本的请求
监听PHP / Java Bridge协议请求并调用Java方法或过程
Apache/IIS/console::PHP PhpJavaServlet
require_once("http://localhost:8080/JavaBridge/java/Java.inc");
$System= java("java.lang.System");
echo $System->getProperties();?>
(2)servletPhpCGIServlet直接处理来自Internet客户端的请求
php-script.jar用于使用标准Java 1.6 JSR 223 API以编程方式访问所描述的功能
internet browser PhpCGIServlet php-cgi PhpJavaServlet
2.eg:
require_once("http://localhost:8080/JavaBridge/java/Java.inc");
use java\lang\StringasJString;
use java\util\ArrayListasJList;classString extends JString {
function toString () {return "hello". parent::toString();
}
}
$str= new String("Java");
$list= newJList();
$list->add (java_closure($str));
$list->add ("from PHP");
$ar= java_values ($list->toArray());foreach($ar as $entry) echo "$entry
\n"
?>
浏览器打开,输出
说明:
(1)php需要修改配置文件
allow_url_include = On
(2)如果javaBridge没开启,会报错
try{
require_once("http://localhost:8089/JavaBridge/java/Java.inc");
}catch(Exception $e){
print $e->getMessage();
exit();
}
加上try-cach也还是一样
修改为,下面的可以避免这个问题,没开启是,提示
$url = "http://localhost:8089/JavaBridge/java/Java.inc";
$ch=curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10);
$dxycontent=curl_exec($ch);if(empty($dxycontent)){
echo"没开启javaBridge";
exit();
}
3.client api
比较常用的
java_is_null(mixed $value) 检测value是否为null
java_values(object A $object) 获取值, array, Map or Collection 返回Array,确保返回值不超过php内存限制
java_server_name() server名
java_is_false(mixed $value) 检测value是否为false
java_is_true(mixed $value) 检测value是否为true
java_inspect (object A $object) 返回public fields, public methods, public classes
eg:
echo java_inspect($calendar);
其他应用实例 详见