PHP与JAVA通信

@[toc]

使用php-java-brigde与JAVA通信

前些天因为要开发有关网银的应用,签名一定要用java的API,花了点时间研究。

环境

  • Centos 6.5

实施过程:

运行java需要安装JDK,这个步骤本文省略,请自行安装

1.下载php-java-brigde应用包

  • 地址:http://osdn.jp/projects/sfnet_php-java-bridge/releases/
  • 本文应用版本:php-java-bridge_6.2.1_documentation.zip

2.解压php-java-brigde

  1. 解压出 documentationJavaBridge.war 两个文件(夹)
    • 命令:unzip php-java-bridge_6.2.1_documentation.zip
  2. 根据文档:documentation/README 中的描述执行以下命令
    • 命令:java -classpath JavaBridge.war TestInstallation
      • 经上面命令后,从javabridge.war中得出以下文件:
        php-java
        ├── documentation
        ├── ext
        ├── java
        ├── JavaBridge.war
        ├── RESULT.html
        └── test.php

3.启动JavaBridge.jar

  1. 如何启动javaBridge.jar呢?:
    • 使用: java -jar ext/JavaBridge.jar –h 查看帮助,得知启动方式
    • Example 1: java -jar JavaBridge.jar
    • Example 2: java -jar JavaBridge.jar HTTP_LOCAL:8080 3 JavaBridge.log
    • Example 3: java -Djavax.net.ssl.keyStore=mySrvKeystore -Djavax.net.ssl.keyStorePassword=YOURPASSWD -jar JavaBridge.jar HTTPS:8443 3 JavaBridge.log
  2. 本文参考Example 2 来启动:
    • **java -jar ext/JavaBridge.jar SERVLET_LOCAL:8080 3 /var/log/JavaBridge.log **
    • 如需后台运行请在命令后加 “&”:
    • java -jar ext/JavaBridge.jar SERVLET_LOCAL:8080 3 /var/log/JavaBridge.log &

4.准备完毕,测试是否成功

vim test.php

require_once './java/Java.inc';
$javaObj = new Java('java.lang.System');
var_dump($javaObj);

只要正常打印出对象就说明已经链接成功了!

5.调用自定义的jar包

创建一个java文件Demo.java

/*一个简单的测试*/
class Demo
{
        // 返回两数和
        public int test(int num1,int num2)
        {
                return num1+num2;
        }
}

编译Demo.java和打包成jar

  • 编译:
    • javac Demo.java
    • 生成 Demo.class
  • 打包成jar
    • jar -cvf /usr/java/packages/lib/ext/Demo.jar Demo.class
    • jar -cvf [目标] [源]
  • 为什么上面的目标位置是/usr/java/packages/lib/ext/? 在启动JavaBridge.jar时会显示如下信息:
    • 标黑的那一行会告诉你,自定义的jar包该放在哪个位置

l@y:/home/www/html/php-java$ java -jar ext/JavaBridge.jar SERVLET_LOCAL:8080 3 /var/log/JavaBridge.log
java.io.FileNotFoundException: /var/log/JavaBridge.log (权限不够)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.(FileOutputStream.java:221)
at java.io.FileOutputStream.(FileOutputStream.java:110)
at php.java.bridge.Util.redirectJavaOutput(Util.java:1320)
at php.java.bridge.Util.redirectOutput(Util.java:1314)
at php.java.bridge.JavaBridge.initLog(JavaBridge.java:264)
at php.java.bridge.Standalone.checkServlet(Standalone.java:206)
at php.java.bridge.Standalone.init(Standalone.java:172)
at php.java.bridge.Standalone.main(Standalone.java:302)
Aug 20 02:34:22 JavaBridge INFO : VM : 1.7.0_79@http://java.oracle.com/
Aug 20 02:34:22 JavaBridge INFO : JavaBridge version : 6.2.1
Aug 20 02:34:22 JavaBridge INFO : logFile : /var/log/JavaBridge.log
Aug 20 02:34:22 JavaBridge INFO : default logLevel : 3
Aug 20 02:34:22 JavaBridge INFO : socket : SERVLET_LOCAL:8080
Aug 20 02:34:22 JavaBridge INFO : java.ext.dirs : /usr/lib/jvm/java-7-openjdk-amd64/jre/lib/ext:/usr/java/packages/lib/ext
Aug 20 02:34:22 JavaBridge INFO : php.java.bridge.base: /home/l
Aug 20 02:34:22 JavaBridge INFO : thread pool size : 20
Aug 20 02:34:22 JavaBridge INFO : JavaBridgeRunner started on port INET_LOCAL:8080

调用刚刚写好的方法
——注:当新增自定义jar包到扩展目录时,请重新启动JavaBridge
vim test.php

require_once './java/Java.inc';
$javaObj = new Java('Demo');    //创建Demo实例
echo $javaObj->test(3,5);    //求两数之和

结果输出:8

这样我们就完成了一次PHP JAVA的简单通信,深入研究请看documentaction/README 或查阅更多资料

发表评论

电子邮件地址不会被公开。 必填项已用*标注