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 相关文章推荐
mysql4.1以上版本连接时出现Client does not support authentication protocol问题解决办法
Mar 15 PHP
一个基于PDO的数据库操作类(新) 一个PDO事务实例
Jul 03 PHP
PHP在线生成二维码代码(google api)
Jun 03 PHP
php实现文件下载简单示例(代码实现文件下载)
Mar 10 PHP
php数组操作之键名比较与差集、交集赋值的方法
Nov 10 PHP
php利用事务处理转账问题
Apr 22 PHP
PHP编程开发怎么提高编程效率 提高PHP编程技术
Nov 09 PHP
Yii2创建表单(ActiveForm)方法详解
Jul 23 PHP
教你在header中隐藏php的版本信息
Aug 10 PHP
Laravel中10个有用的用法小结
May 06 PHP
PHP7 windows支持
Mar 09 PHP
PHP判断是否是json字符串
Apr 01 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
centos 5.6 升级php到5.3的方法
2011/05/14 PHP
PHP获取Exif缩略图的方法
2015/07/13 PHP
php实现微信扫码支付
2017/03/26 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
2017/08/11 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
javascript URL锚点取值方法
2009/02/25 Javascript
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
Prototype源码浅析 String部分(二)
2012/01/16 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
jQuey将序列化对象在前台显示地实现代码(方法总结)
2016/12/13 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
JS实现的二叉树算法完整实例
2017/04/06 Javascript
echarts学习笔记之箱线图的分析与绘制详解
2017/11/22 Javascript
在vscode中统一vue编码风格的方法
2018/02/22 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
你或许不知道的一些npm实用技巧
2019/07/04 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
如何利用JavaScript编写一个格斗小游戏
2021/01/06 Javascript
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
[51:20]完美世界DOTA2联赛PWL S2 Magma vs PXG 第一场 11.28
2020/12/01 DOTA
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Atom的python插件和常用插件说明
2018/07/08 Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
2020/04/18 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
python求解汉诺塔游戏
2020/07/09 Python
python实现xml转json文件的示例代码
2020/12/30 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
曼城官方网上商店:Manchester City
2019/09/10 全球购物
为什么如下的代码int a=100,b=100;long int c=a * b;不能工作
2013/11/29 面试题
简单叙述一下MYSQL的优化
2016/05/09 面试题
2014年安全工作总结范文
2014/11/13 职场文书
泰山导游词
2015/02/02 职场文书
使用javascript解析二维码的三种方式
2021/11/11 Javascript