PHP与Java进行通信的实现方法


Posted in PHP onOctober 21, 2013

缘起:

最近做了一个电商平台与网银整合的小东西,程序是开源的 Ecmall的,网银的接口也很规范,给出的文档很全,唯一的小问题是,网银使用的签名和验签的lib是只有java和c的,对java还熟悉一些,所以选择了使用java作为签名和验签的接口。

方法:

网上关于php与java交互的资料其实挺多的。总体来说其实也是这么几种方法:

•PHP直接通过exec或者system之类的命令调用命令行,然后以java Hello 这种类型得方式来运行java程序,但是缺点是很明显的,不能很好地与java类里面的各种方法进行交互,而且这种方式最终获取的运行结果也有行数限制,所以舍弃。
•PHP与Java通过WebService的方式进行通信,自己在Java端开放相关的WebService服务,然后通过XML或者JSON让PHP调用Java的WebService,这种方式比较大众,能实现的功能可定制性也强,但是缺点页非常明显
•要安装TomCat服务器,从而发布出Java端的相关报文
•WebService要写认证,对签名和验签的流程做出相关的安全认证
•PHP通过PHP-JAVA-BRIDGE这个模块,实现PHP和Java的通信,这个模块配置安装相对简单,所以选择了使用这个模块进行PHP和java的通信

第一步

安装java环境和PHP环境 PHP环境略 CentOS下YUM方式安装JAVA环境

yum install java
yum install yum install java*jdk*devel*

测试java-version如果有类似如下结果输出,则java环境安装成功

java version "1.7.0_25"
OpenJDK Runtime Environment (rhel-2.3.10.4.el6_4-x86_64)
OpenJDK 64-Bit Server VM (build 23.7-b01, mixed mode)

第二步

编译安装php-java-bridge模块

下载包:

PHP-JAVA-BRIDGE4.0 这个版本是4.0的,最新版本应该是6,在sourceforg上有下载,不过6的用法跟4的用法差距似乎有些大

编译安装:

解压缩php-java-bridge,进入php-java-bridge的目录,将php-java-bridge编译成php的扩展

 tar xzvf php-java-bridge_4.0.1.orig.tar.gz
    cd php-java-bridge
    phpize
    ./configure --disable-servlet --with-java= --with-php-config=/usr/local//php/bin/php-config   
    make
    make install

•如果phpize命令运行后无效,可以通过yum install php-devel解决
•configure里,java参数里填写的是jdk和jre的路径 php里填写的是 php-config文件的具体目录
•编译完成以后,在php的lib/php/extensions/no-debug-non-zts-20060613里会增加java.so文件和JavaBridge.jar

第三步

配置相关参数
打开php.ini文件,在末尾加上如下参数:

extension="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/java.so"
[java]
java.java_home="/usr/lib/jvm/java-1.7.0-openjdk.x86_64"
java.java="/usr/lib/jvm/java-1.7.0-openjdk.x86_64/jre/bin/java"
java.log_file="/var/log/php-java-bridge.log"
java.classpath="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/JavaBridge.jar"
java.libpath="/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613"
java.log_level="2"

如果是mod_php方式运行的,那么重启Apache

如果是fast_cgi方式运行的php,那么重启php-fpm以及nginx或者apache服务器

第四步

测试

    phpinfo();

运行结果中出现

PHP与Java进行通信的实现方法

证明扩展正确安装并且可以正常使用.

demo1(调用java标准class)

<?php 
$system=new Java("java.lang.System");
print "Java version=".$system->getProperty("java.version")." ";
$str=new Java("java.lang.String");
echo $str;

demo2(调用自定义class)

在/data目录下新建一个test目录,然后创建一个Hello.java的文件作为测试

public class Hello
{
    public static void main(String[] args)
    {
        System.out.println("php java bridge test"); 
    }
    public String getHi(){
        return "hi, every sudt linux member";
    }
}
javac Hello.java
java Hello
jar cvf hello.jar Hello.class

将我们的Hello.class打包成一个jar包以后,然后我们便可以在PHP中通过实例化一个Java的类来直接调用getHi()方法了.

ini_set('display_errors', 1);
java_require('/data/test/hello.jar');
$hello = new Java('Hello');
$hi = $hello->getHi();
echo $hi;
$php_hi = (string) $hi;
var_dump($php_hi);

运行结果:

[o(String):"hi, every sudt linux member"]
string(27) "hi, every sudt linux member"

要注意的一点小问题:

1. java里面的public String getHi() 不能省略public,要不然默认的getHi()方法是private的,这样在PHP里面是无法调用的。

2. 在PHP里调用了java的类以后,返回结果是java的o(variable),最好做一下强制类型转换,转换成PHP的变量类型来进行使用。

3. 我们在java_require()的时候,最好使用绝对路径,这样就不用非得把要调用的jar包放到我们在php.ini里配置的libpath里了。

4. 在new Java()的时候,类名的首字母一定要大些,否则会报错,java会找不到这个类的。

PHP 相关文章推荐
SSI指令
Nov 25 PHP
PHP print类函数使用总结
Jun 25 PHP
php实现rc4加密算法代码
Apr 25 PHP
PHP父类调用子类方法的代码例子
Apr 09 PHP
PHP开发框架laravel安装与配置教程
Mar 13 PHP
php使用Imagick生成图片的方法
Jul 31 PHP
3种php生成唯一id的方法
Nov 23 PHP
分享PHP源码批量抓取远程网页图片并保存到本地的实现方法
Dec 01 PHP
100行PHP代码实现socks5代理服务器
Apr 28 PHP
PHP 配置后台登录以及模板引入
Jan 24 PHP
一个实用的php验证码类
Jul 06 PHP
PHP分页显示的方法分析【附PHP通用分页类】
May 10 PHP
php中生成随机密码的自定义函数代码
Oct 21 #PHP
php中读写文件与读写数据库的效率比较分享
Oct 19 #PHP
PHP中include与require使用方法区别详解
Oct 19 #PHP
php文件上传的简单实例
Oct 19 #PHP
php上传文件,创建递归目录的实例代码
Oct 18 #PHP
php用户注册页面利用js进行表单验证具体实例
Oct 17 #PHP
10 个经典PHP函数
Oct 17 #PHP
You might like
DC动漫人物排行
2020/03/03 欧美动漫
php的array_multisort()使用方法介绍
2012/05/16 PHP
ThinkPHP模板IF标签用法详解
2014/07/01 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
Firefox 无法获取cssRules 的解决办法
2006/10/11 Javascript
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
基于datagrid框架的查询
2013/04/08 Javascript
js实现带关闭按钮始终显示在网页最底部工具条的方法
2015/03/02 Javascript
讲解JavaScript的Backbone.js框架的MVC结构设计理念
2016/02/14 Javascript
基于jquery实现即时检查格式是否正确的表单
2016/05/06 Javascript
Node.js的Koa框架上手及MySQL操作指南
2016/06/13 Javascript
JS基于构造函数实现的菜单滑动显隐效果【测试可用】
2016/06/21 Javascript
js 创建对象 经典模式全面了解
2016/08/16 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
解析jQueryEasyUI的使用
2016/11/22 Javascript
详谈$.data()的用法和作用
2017/02/13 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
layui select获取自定义属性方法
2018/08/15 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
Vue 数据响应式相关总结
2021/01/28 Vue.js
Python3 Random模块代码详解
2017/12/04 Python
python绘制条形图方法代码详解
2017/12/19 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
详解用Python为直方图绘制拟合曲线的两种方法
2019/08/21 Python
Selenium自动化测试工具使用方法汇总
2020/06/12 Python
七匹狼男装广告词
2014/03/21 职场文书
2014县委书记党的群众路线教育实践活动对照检查材料思想汇报
2014/09/22 职场文书
机械专业毕业生自我鉴定2014
2014/10/04 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
2015年感恩节活动总结
2015/03/24 职场文书
2015小学教师年度工作总结
2015/05/12 职场文书
Python中使用ipython的详细教程
2021/06/22 Python
Vue+TypeScript中处理computed方式
2022/04/02 Vue.js
解决flex布局中子项目尺寸不受flex-shrink限制
2022/05/11 HTML / CSS