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
文件,在末尾加上如下参数:
<code>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"</code>
如果是mod_php方式运行的,那么重启Apache
如果是fast_cgi方式运行的php,那么重启php-fpm以及nginx或者apache服务器
第四步
测试
phpinfo();
运行结果中出现 证明扩展正确安装并且可以正常使用.
demo1(调用java标准class)
<span style="color: #008080;">1</span> <?<span style="color: #000000;">php </span><span style="color: #008080;">2</span> <span style="color: #800080;">$system</span>=<span style="color: #0000ff;">new</span> Java("java.lang.System"<span style="color: #000000;">); </span><span style="color: #008080;">3</span> <span style="color: #0000ff;">print</span> "Java version=".<span style="color: #800080;">$system</span>->getProperty("java.version")." "<span style="color: #000000;">; </span><span style="color: #008080;">4</span> <span style="color: #800080;">$str</span>=<span style="color: #0000ff;">new</span> Java("java.lang.String"<span style="color: #000000;">); </span><span style="color: #008080;">5</span> <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$str</span>;
demo2(调用自定义class)
在/data目录下新建一个test目录,然后创建一个Hello.java的文件作为测试
<span style="color: #008080;"> 1</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span><span style="color: #000000;"> Hello </span><span style="color: #008080;"> 2</span> <span style="color: #000000;">{ </span><span style="color: #008080;"> 3</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 5</span> System.out.println("php java bridge test"<span style="color: #000000;">); </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 7</span> <span style="color: #008080;"> 8</span> <span style="color: #0000ff;">public</span><span style="color: #000000;"> String getHi(){ </span><span style="color: #008080;"> 9</span> <span style="color: #0000ff;">return</span> "hi, every sudt linux member"<span style="color: #000000;">; </span><span style="color: #008080;">10</span> <span style="color: #000000;"> } </span><span style="color: #008080;">11</span> }
<span style="color: #000000;">javac Hello.java java Hello jar cvf hello.jar Hello.class</span>
将我们的Hello.class打包成一个jar包以后,然后我们便可以在PHP中通过实例化一个Java的类来直接调用getHi()方法了.
<span style="color: #008080;">1</span> <span style="color: #008080;">ini_set</span>('display_errors', 1<span style="color: #000000;">); </span><span style="color: #008080;">2</span> java_require('/data/test/hello.jar'<span style="color: #000000;">); </span><span style="color: #008080;">3</span> <span style="color: #800080;">$hello</span> = <span style="color: #0000ff;">new</span> Java('Hello'<span style="color: #000000;">); </span><span style="color: #008080;">4</span> <span style="color: #800080;">$hi</span> = <span style="color: #800080;">$hello</span>-><span style="color: #000000;">getHi(); </span><span style="color: #008080;">5</span> <span style="color: #0000ff;">echo</span> <span style="color: #800080;">$hi</span><span style="color: #000000;">; </span><span style="color: #008080;">6</span> <span style="color: #800080;">$php_hi</span> = (<span style="color: #0000ff;">string</span>) <span style="color: #800080;">$hi</span><span style="color: #000000;">; </span><span style="color: #008080;">7</span> <span style="color: #008080;">var_dump</span>(<span style="color: #800080;">$php_hi</span>);
运行结果:
<span style="color: #000000;">[o(String):"hi, every sudt linux member"] string(27) "hi, every sudt linux member"</span>
要注意的一点小问题:
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会找不到这个类的。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

Java 8引入了Stream API,提供了一种强大且表达力丰富的处理数据集合的方式。然而,使用Stream时,一个常见问题是:如何从forEach操作中中断或返回? 传统循环允许提前中断或返回,但Stream的forEach方法并不直接支持这种方式。本文将解释原因,并探讨在Stream处理系统中实现提前终止的替代方法。 延伸阅读: Java Stream API改进 理解Stream forEach forEach方法是一个终端操作,它对Stream中的每个元素执行一个操作。它的设计意图是处

如果您是一位经验丰富的 PHP 开发人员,您可能会感觉您已经在那里并且已经完成了。您已经开发了大量的应用程序,调试了数百万行代码,并调整了一堆脚本来实现操作

Java是热门编程语言,适合初学者和经验丰富的开发者学习。本教程从基础概念出发,逐步深入讲解高级主题。安装Java开发工具包后,可通过创建简单的“Hello,World!”程序实践编程。理解代码后,使用命令提示符编译并运行程序,控制台上将输出“Hello,World!”。学习Java开启了编程之旅,随着掌握程度加深,可创建更复杂的应用程序。

胶囊是一种三维几何图形,由一个圆柱体和两端各一个半球体组成。胶囊的体积可以通过将圆柱体的体积和两端半球体的体积相加来计算。本教程将讨论如何使用不同的方法在Java中计算给定胶囊的体积。 胶囊体积公式 胶囊体积的公式如下: 胶囊体积 = 圆柱体体积 两个半球体体积 其中, r: 半球体的半径。 h: 圆柱体的高度(不包括半球体)。 例子 1 输入 半径 = 5 单位 高度 = 10 单位 输出 体积 = 1570.8 立方单位 解释 使用公式计算体积: 体积 = π × r2 × h (4
