zoukankan      html  css  js  c++  java
  • PHP通过php-java-bridge调用JAVA的jar包里class类

    正 文:

     

    有的时候我们需要在PHP里调用JAVA平台封装好的jar包里的class类和方法,一般飘易推荐的做法是采用php-java-bridge做桥接,本文就来介绍一下大致的实现方法。

    先简单说下php-java-bridge做桥接的实现原理

    先打开java的一个监听端口,php调用java的时候,将对应的方法调用转发到java的指定端口,由java执行后再将结果返回给php。这种模式是一种比较典型的代理模式,php在这里成为了一个代理转发器,把java的类调用转发给后端的java执行。

    我们再来看看具体的流程

    1、下载二进制的 JavaBridge.jar包、java/Java.inc库文件,下载地址:http://php-java-bridge.sourceforge.net/pjb/download.php

    注意,当前最新版本是PHP/Java Bridge 6.2.1,但是这个版本也是2010-10-31更新的,现在都2016年了,都过去6年了,从这个更新日期来看,源码编译安装的方式只适合在此日期之前发布的PHP版本,比如PHP 5.3.3发布日期是2010-7-22,但是保守估计,源码编译安装的方式仅适合PHP 5.2以及更低的PHP版本,不适合PHP 5.3/PHP 5.4/PHP 5.5/PHP 5.6/PHP 7这些高版本的PHP了,源码编译最高只支持到PHP5.2。飘易这里不采用源码安装的方式,直接使用二进制包打开监听端口就可以了。

    2、linux下安装java环境,具体安装方法就不说了,搜索下;飘易使用的是java-1.7,留意下环境配置:

    文件 /etc/profile 末尾添加:

    export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

    然后,source /etc/profile 使之立即生效。

    PS: 如何找到java安装路径呢?

    3、将JAVA的jar包文件放置在java的库位置 $JAVA_HOME/jre/lib/ext/,如

    /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.51-2.4.5.5.el7.x86_64/jre/lib/ext/app-security.jar

    4、在JavaBridge.jar所在目录运行命令(先cd到所在目录) 

    java -jar JavaBridge.jar SERVLET_LOCAL:8081 &

    (加&是让其在后台运行)

    或者直接带上日志等级

    java -jar JavaBridge.jar SERVLET:8081 3 JavaBridge.log &

    执行后,我们使用命令netstat -nltp,发现linux已经开启了一个8081端口开始监听:

    PS:如果需要开机启用,配置:

    /etc/rc.local 添加开机启动

    java -jar JavaBridge.jar所在绝对路径 SERVLET_LOCAL:8081 &

    5、在web目录下放置 Java.inc文件,编写php测试代码 test.php

    <?php header( 'Content-Type: text/html; charset=UTF-8' );
    
    define("JAVA_DEBUG", true); //调试设置
    define("JAVA_HOSTS", "127.0.0.1:8081"); //设置javabridge监听端口
    /*0: Log nothing, not even fatal errors.
      1: Log fatal system errors such as "out of memory error".
      2: Log java exceptions.*/
    define("JAVA_LOG_LEVEL", 2); //java.log_level: 0-6
    
    require_once "Java.inc"; //php调用java的接口,与该脚本位于同一目录
    java_set_file_encoding("UTF-8"); //设置JAVA编码。
    
    try {
      /* invoke java.lang.System.getProperties() */
      $props = java("java.lang.System")->getProperties();
      
      /* convert the result object into a PHP array */
      $array = java_values($props);
      foreach($array as $k=>$v) {
        echo "$k=>$v"; echo "<br>
    ";
      }
      echo "<br>
    ";
      
      /* create a PHP class which implements the Java toString() method */
      class MyClass {
        function toString() { return "hello PHP from Java!"; }
      }
      
      /* create a Java object from the PHP object */
      $javaObject = java_closure(new MyClass());
      echo "PHP says that Java says: "; echo $javaObject;  echo "<br>
    ";
      echo "<br>
    ";
    
      echo java("php.java.bridge.Util")->VERSION; echo "<br>
    ";
    
    } catch (JavaException $ex) {
      echo "An exception occured: "; echo $ex; echo "<br>
    ";
    }

    6、PHP如何调用自己编写的java类呢?

    $Des3 = new Java("com.ksoft.security.Des3"); //实例
    try{    
        echo $Des3->encode('88290801', $key);
        echo "<hr>";
        echo $Des3->decode('S2JFP23v0zM=', $key);
    }
    catch(Exception $e) {
        echo($e);
    }

    【一些注意事项】:

    关于PHP-Java-Bridge的各种函数使用:

    1、高版本的java_require不再使用,也无法使用,由于放到java虚拟机下面,则不需要再手动引入包文件。

    2、java_value()用于获取值,而且必须使用该函数获取值。

    (特别注意:如果该值需要存入数据库,那么必须使用该java_value函数,不然会报错,或者无法存入数据库)

    3、java_inspect()对实例化或者方法进行print_r类似的输出。

    (注:请不要直接使用var_dump这样的输出方法输出java的类、方法、变量,需要使用java_inspect或者java_value,例如:var_dump(java_inspect($abc)))

    4、实例化使用 $test = new Java("Test")的方式,如果实例化的方法中存在参数,可以这样new Java("Test","pram")

    提醒

    1、务必确保对java.inc的引用,确保引用正确

    2、务必确保对jar包放在能引用的地方,比如java虚拟机jre下面

    3、在PHP中调用Java使用PHP的的写法即可

    【参考】:

    1、PHP-Java-Bridge使用笔记

    2、PHP-Java-Bridge的使用(平安银行支付功能专版)

    3、使用php-java-bridge让PHP5支持java

    4、Linux下配置php-java-bridge

     引用自 http://www.piaoyi.org/php/php-java-bridge-jar-class.html
  • 相关阅读:
    Windows API 的数据类型与 Delphi 数据类型对照表
    Delphi 编译错误信息表
    Delphi中的容器类
    Delphi 快捷键
    代码折叠
    [转]Delphi中record的使用
    [转]常用公共函数单元
    Delphi 运行时错误信息表
    C#调用Win32 的API函数User32.dll
    [转]Delphi程序启动参数的读取
  • 原文地址:https://www.cnblogs.com/yangjinqiang/p/11358691.html
Copyright © 2011-2022 走看看