缘起:

最近做了一个电商平台与网银整合的小东西,程序是开源的 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会找不到这个类的。

java能否访问PHP的服务器,PHP与Java进行通信的实现方法相关推荐

  1. java中访问不可视字段_Kotlin与Java的不同之处

    code小生,一个专注 Android 领域的技术平台 公众号回复 Android 加入我的安卓技术群 作者:小村医 链接:https://www.jianshu.com/p/f7deb4fe6427 ...

  2. JAVA基础(三)——服务器操作系统、Java开发环境、Java技术架构、定义Java类及其命名规范、Java注释方式

    1. 服务器操作系统 当前主流的服务器操作系统则主要分为:Windowsserver.UNIX.Linux.NetWare这四大阵容. (1)Windowsserver作为推广的最好,用户群体最大的服 ...

  3. java ee项目部署到服务器上405,HTTP状态405 - HTTP POST方法不受此URL支持:采用的GlassFish服务器的NetBeans...

    I am getting this error on using post method in my form-- HTTP Status 405 - HTTP method POST is not ...

  4. 服务器如何运行java文件_在linux服务器上运行java文件

    1.  在windows环境下编写java类,如java类是Test类. 2.  将该Test类上传到linux服务器上,命令如下: mapred@10:/bwdata168_2/hyg$rz  -b ...

  5. java怎么访问私有类_如何从Java类的外部访问类的私有方法?

    您可以使用java反射包访问类的私有方法. 步骤1-通过传递声明为私有的方法的方法名称来实例化java.lang.reflect包的Method类. 步骤2-通过将值true传递给setAccessi ...

  6. java通用库,java数据库访问通用种

    java数据库访问通用类; package org.studentmanager.commons; /** * java数据库访问通用类; * @author clplain; * */ import ...

  7. 读书笔记之《实战Java虚拟机》(2):认识Java虚拟机的基本结构

    基本结构 类加载子系统 负责从文件系统,或者网络中加载Class信息: 方法区 存放加载的Class信息,和运行时常量: Java堆 在虚拟机启动时建立,是Java程序最主要的内存工作区域,几户所有对 ...

  8. Java实习生常规技术面试题每日十题Java基础(二)

    目录 1. JAVA 的反射机制的原理. 2.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 3.如何将String类型转化成Number类型. 4.什 ...

  9. 使用java如何访问报表服务器_Java访问远程http服务器上数据的简便方法

    Java开发项目中,有时会访问远程http服务器上的数据,数据可能是xml格式或者json格式等.这里我们通过例子来看一下两种实现方式的对比. 本例子中有一个servlet,对外提供json格式的雇员 ...

最新文章

  1. opencv 图片剪切
  2. 【推荐系统入门】一窥推荐系统的原理
  3. 数组指针和指针数组,函数指针和指针函数,常量指针和指针常量,常量引用
  4. step5 . day5 网络编程 基于UDP协议的多人网络在线聊天功能
  5. bootstrap --- 分页
  6. flink的watermark参考配置
  7. 引用activity_允许其他应用启动您的 Activity
  8. ESP32使用Arduino环境,安装、编译、下载、安装库
  9. java排序算法学习(一)--冒泡排序
  10. 【实物】端到端自动驾驶搭建教程(四)附完整资料
  11. 元月元日是哪一天_元宵节的农历日期是哪一天 - 中国万年历
  12. 计算机网络基础(韩立刚视频笔记)第一章 概述
  13. 聊天软件开发_3_数据库表设计
  14. pocket英语语法入门
  15. tplink服务器无响应dns,tplink路由器自动获取ip设置后dns异常
  16. Linux之常见面试题知识点批注(七)
  17. tenacity 报错_Python Tenacity 实现重试机制
  18. 决手动打开凭据管理器报0x80070005错误的问题-CMD方式
  19. H3C 胖AP设置(非VLAN模式)
  20. 【微信小程序】模板消息推送(测试成功)。

热门文章

  1. 【指标导出】指标原始数据导出流程
  2. C++11带来的全新数值和字符串转换函数
  3. MySql 5.7 重置root密码
  4. 最大矩阵(简单DP)
  5. mysql查看修改字符集
  6. Reverse Words in a String
  7. Java内存模型与线程(思维导图)
  8. Python网络请求urllib和urllib3详解
  9. 深度学习输入模式与适当的网络架构之间的对应关系
  10. 机器学习系列-随机过程