java能否访问PHP的服务器,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会找不到这个类的。
java能否访问PHP的服务器,PHP与Java进行通信的实现方法相关推荐
- java中访问不可视字段_Kotlin与Java的不同之处
code小生,一个专注 Android 领域的技术平台 公众号回复 Android 加入我的安卓技术群 作者:小村医 链接:https://www.jianshu.com/p/f7deb4fe6427 ...
- JAVA基础(三)——服务器操作系统、Java开发环境、Java技术架构、定义Java类及其命名规范、Java注释方式
1. 服务器操作系统 当前主流的服务器操作系统则主要分为:Windowsserver.UNIX.Linux.NetWare这四大阵容. (1)Windowsserver作为推广的最好,用户群体最大的服 ...
- 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 ...
- 服务器如何运行java文件_在linux服务器上运行java文件
1. 在windows环境下编写java类,如java类是Test类. 2. 将该Test类上传到linux服务器上,命令如下: mapred@10:/bwdata168_2/hyg$rz -b ...
- java怎么访问私有类_如何从Java类的外部访问类的私有方法?
您可以使用java反射包访问类的私有方法. 步骤1-通过传递声明为私有的方法的方法名称来实例化java.lang.reflect包的Method类. 步骤2-通过将值true传递给setAccessi ...
- java通用库,java数据库访问通用种
java数据库访问通用类; package org.studentmanager.commons; /** * java数据库访问通用类; * @author clplain; * */ import ...
- 读书笔记之《实战Java虚拟机》(2):认识Java虚拟机的基本结构
基本结构 类加载子系统 负责从文件系统,或者网络中加载Class信息: 方法区 存放加载的Class信息,和运行时常量: Java堆 在虚拟机启动时建立,是Java程序最主要的内存工作区域,几户所有对 ...
- Java实习生常规技术面试题每日十题Java基础(二)
目录 1. JAVA 的反射机制的原理. 2.静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 3.如何将String类型转化成Number类型. 4.什 ...
- 使用java如何访问报表服务器_Java访问远程http服务器上数据的简便方法
Java开发项目中,有时会访问远程http服务器上的数据,数据可能是xml格式或者json格式等.这里我们通过例子来看一下两种实现方式的对比. 本例子中有一个servlet,对外提供json格式的雇员 ...
最新文章
- opencv 图片剪切
- 【推荐系统入门】一窥推荐系统的原理
- 数组指针和指针数组,函数指针和指针函数,常量指针和指针常量,常量引用
- step5 . day5 网络编程 基于UDP协议的多人网络在线聊天功能
- bootstrap --- 分页
- flink的watermark参考配置
- 引用activity_允许其他应用启动您的 Activity
- ESP32使用Arduino环境,安装、编译、下载、安装库
- java排序算法学习(一)--冒泡排序
- 【实物】端到端自动驾驶搭建教程(四)附完整资料
- 元月元日是哪一天_元宵节的农历日期是哪一天 - 中国万年历
- 计算机网络基础(韩立刚视频笔记)第一章 概述
- 聊天软件开发_3_数据库表设计
- pocket英语语法入门
- tplink服务器无响应dns,tplink路由器自动获取ip设置后dns异常
- Linux之常见面试题知识点批注(七)
- tenacity 报错_Python Tenacity 实现重试机制
- 决手动打开凭据管理器报0x80070005错误的问题-CMD方式
- H3C 胖AP设置(非VLAN模式)
- 【微信小程序】模板消息推送(测试成功)。