php java 通信_PHP与Java进行通信的实现方法

缘起:

最近做了一个电商平台与网银整合的小东西,程序是开源的 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();

运行结果中出现

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

demo1(调用java标准class)

复制代码 代码如下:

$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会找不到这个类的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/485832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode--397. 整数替换

给定一个正整数 n,你可以做如下操作: 1. 如果 n 是偶数,则用 n / 2替换 n。 2. 如果 n 是奇数,则可以用 n 1或n - 1替换 n。 n 变为 1 所需的最小替换次数是多少? 示例 1: 输入: 8 输出: 3 解释: 8 -> 4 ->…

亚马逊首席技术官预测2021年将改变世界的八大技术趋势

来源:世界科技研究与发展2020年12月17日,亚马逊全球副总裁、首席技术官维尔纳•沃格尔(Werner Vogels)博士在亚马逊re:Invent全球大会上发表压轴演讲,分享了他对2021年科技趋势的预测。回顾2020年,Werner表…

Leetcode--268. 缺失数字

给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。 示例 1: 输入: [3,0,1] 输出: 2 示例 2: 输入: [9,6,4,2,3,5,7,0,1] 输出: 8 说明: 你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现? 方法一&#xf…

lingo逻辑运算符

LINGO 具有9种逻辑运算符:#not# 否定该操作数的逻辑值,#not#是一个一元运算符#eq# 若两个运算数相等,则为true;否则为flase#ne# 若两个运算符不相等,则为true;否则为flase#gt# 若左边…

《城市大脑全球标准研究报告2020》摘要内容

‍‍前言:《城市大脑全球标准研究报告2020》12月23在京正式发布,有近70位专家、领导和媒体记者出席了发布会,会后包括新华社、工人日报、中新社、科技日报、中国科学报、中国社会科学报、中国建设报、经济日报、中国经营报、经济观察报&#…

EasyExcel中处理内容占多个单元格

在一些业务需求中内容需要占用多个单元格的情况,如下图: 或者是这样 这样 总有一些奇怪怪的需求。 不过使用EasyExcel可以轻松处理这些变态的需求。EasyExcel中提供了ContentLoopMerge 注解就是为了处理这种问题的。下面先看看如何使用ContentLoopMe…

java处理unicode_C# JavaScript Java 与 中文 unicode 处理

C#// 将汉字转换为Unicode//要转换的字符串///public static string GBToUnicode(string text){byte[] bytes System.Text.Encoding.Unicode.GetBytes(text);string lowCode "", temp "";for (int i 0; i{if (i % 20){temp System.Convert.ToString(by…

Leetcode--260. 只出现一次的数字Ⅲ

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。 示例 : 输入: [1,2,1,3,2,5] 输出: [3,5] 注意: 结果输出的顺序并不重要,对于上面的例子, [5, 3] 也…

洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】

题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空位就用二分 主席树 理应可以在主席树上的区间二分而做到\(O(nlogn)\)&…

2021十大科技趋势来了!阿里巴巴达摩院全新发布

来源: 阿里技术阿里巴巴达摩院发布2021十大科技趋势,这是达摩院成立三年以来第三次发布年度科技趋势。2020年是不平凡的一年,经历疫情的洗礼,许多行业重启向上而生的螺旋,但疫情并未阻挡科技前进的脚步,量子…

Leetcode--342. 4的幂

给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。 示例 1: 输入: 16 输出: true 示例 2: 输入: 5 输出: false 进阶: 你能不使用循环或者递归来完成本题吗? 方法一: class Solution { public …

bzoj 1731: [Usaco2005 dec]Layout 排队布局【差分约束】

差分约束裸题&#xff0c;用了比较蠢的方法&#xff0c;先dfs_spfa判负环&#xff0c;再bfs_spfa跑最短路 注意到“奶牛排在队伍中的顺序和它们的编号是相同的”&#xff0c;所以\( d_i-d_{i-1}>0 \),连(i,i-1,0)&#xff1b;然后对于\( d_i-d_j<L \)&#xff0c;连(j,i,…

从GPT-3到DETR,一起来盘点2020有哪些突破?

来源&#xff1a;深度学习技术前沿2020年是巨大飞跃的一年。从OpenAI的GPT-3&#xff0c;再到AlphaFold&#xff0c;都是令人振奋的成就。与此同时&#xff0c;数据科学在机器学习、自然语言处理&#xff08;NLP&#xff09;、计算机视觉等领域中蓬勃发展。一起来逐一盘点2020的…

java script 技巧_java script 技巧

事件源对象event.srcElement.tagNameevent.srcElement.type捕获释放event.srcElement.setCapture();event.srcElement.releaseCapture();事件按键event.keyCodeevent.shiftKeyevent.altKeyevent.ctrlKey事件返回值event.returnValue鼠标位置event.xevent.y窗体活动元素document…

个人作业5——软工个人总结

一、请回望开学时的第一次作业&#xff0c;你对于软件工程课程的想象 对比开篇博客你对课程目标和期待&#xff0c;“希望通过实践锻炼&#xff0c;增强计算机专业的能力和就业竞争力”&#xff0c;对比目前的所学所练所得&#xff0c;在哪些方面达到了你的期待和目标&#xff…

我国5G基站达71.8万个,助力人工智能发展!

来源&#xff1a;新华社2020中国人工智能高峰论坛暨中国人工智能大赛成果发布会23日在厦门举办。论坛上&#xff0c;中国工业和信息化部副部长刘烈宏介绍&#xff0c;截至今年11月&#xff0c;我国累计建成5G基站71.8万个&#xff0c;为人工智能海量数据的成长和传输提供了坚实…

java如何对list进行排序_java中如何对list进行排序

java类中用Collections的sort方法对一个list进行排序&#xff0c;比较简单先建一个User对象public class User {public String name;public Integer age;public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;}public String getName() {retu…

LR中url和html两种录制模式

http://www.cnblogs.com/fnng/archive/2013/02/28/2937805.html转载于:https://www.cnblogs.com/zzzao/p/9196044.html

《自然》预测2021年值得关注的科学事件

来源&#xff1a;世界科技研究与发展作者&#xff1a;黄小容2020年12月22日&#xff0c;Nature官网发布了对2021年最值得关注科学事件的预测。1 气候变化问题卷土重来

Leetcode--3. 无重复字符的最长子串

给定一个字符串&#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc"&#xff0c;所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符…