php java bridge实例,PHP/Java Bridge的使用
一、需求背景
之前介绍过我们项目的架构,由于历史原因,架构演变成asjavaphp这样,java与as通过tcp长连接通信,java与php通过两条http通道来通信(java与php各自有个http server,并各自作为对方的http client,java转发as以前的post给php;php需要跨session推送或者广播时变为http client向java的http server做post)。
这之前的架构是as的功能逻辑大部分直接与php进行http通信。
项目的目标是慢慢将php部分写的糟糕的已有逻辑(例如帮派这种交互和广播同步比较多的)改到java服务器上。项目人员配备跟不上,所以不能一下子全转了。
如果用之前的两条http通道来小步快跑式的移逻辑,就需要再封装这两个通道之间的通信,费时间还不一定好使,所以我们需要一个java直接调用php的技术。
goole了解后,最终决定使用PHP/Java Bridge。
二、PHP/Java Bridge
(一)示例
CallPhp.java
1 package me.sheppardy.study;
2
3 import java.io.ByteArrayOutputStream;
4 import java.io.FileReader;
5
6 import javax.script.ScriptEngine;
7 import javax.script.ScriptEngineManager;
8
9 /**10 *11 * PHP/Java Bridge, example12 *@authorsheppard(ysf1026@gmail.com) 2013-01-1813 *14 */
15 public class CallPhp
16 {
17
18 public static void main(String[] args) throws Exception
19 {
20 test(1104);
21 test(531);
22 test(1221);
23 test(110);
24 }
25
26 public static void test(int id) throws Exception
27 {
28 Response rep = new Response();
29 call(new Request(id), rep);
30 System.out.println("CallPhp.test, id=" + id + " message=" + rep.message);
31 }
32
33 public static void call(Request req, Response rep) throws Exception
34 {
35 ScriptEngineManager engineManager = new ScriptEngineManager();
36 ScriptEngine engine = engineManager.getEngineByName("php-invocable");
37
38 ByteArrayOutputStream log = new ByteArrayOutputStream();
39
40 try
41 {
42 engine.put("phpRootDir", "data/php");
43 engine.put("log", log);
44 engine.put("req", req);
45 engine.put("rep", rep);
46 FileReader reader = new FileReader("data/php/gate.php");
47 engine.eval(reader);
48 System.out.println("CallPhp.call phpLog=" + log.toString());
49 }
50 catch(Exception e)
51 {
52 System.out.println("CallPhp.call phpLog=" + log.toString());
53 throw e;
54 }
55 }
56 }
57
58 class Request
59 {
60 public Request(int id)
61 {
62 this.id = id;
63 }
64 public int id;
65 }
66
67 class Response
68 {
69 public String message;
70 }
java-bin/data/php/gate.php
1 <?php
2
3 /**4 *5 * 脚本统一入口6 * @author sheppard(ysf1026@gmail.com) 2013-01-187 *8 */
9
10 define('PHP_ROOT_DIR', java_context()->get('phpRootDir'));
11 $log = java_context()->get('log');
12 $log->write("\n\tjava give phpRootDir is " . PHP_ROOT_DIR);
13
14 require_once(PHP_ROOT_DIR . '/function.php');
15
16 $log->write(getDoomsday());
17
18 $rep = java_context()->get('rep');
19 $rep->message = handle(java_context()->get('req'), $log);
20
21 ?>
java-bin/data/php/function.php
1 <?php
2
3 /**4 *5 * 具体功能举例6 * @author sheppard(ysf1026@gmail.com) 2013-01-187 *8 */
9
10 function getDoomsday()
11 {
12 return "\n\tdoomsday is 20121221";
13 }
14
15 function handle($req, $log)
16 {
17 $id = $req->id;
18 $log->write("\n\tfunction.php handle id=$id");
19 if('1104' == $id)
20 return 'guess?';
21 else if('531' == $id)
22 return 'score';
23 else if('1221' == $id)
24 return 'maybe doomsday';
25 else
26 return '404 not found';
27 }
28
29 ?>
output
1 CallPhp.call phpLog=
2 java give phpRootDir is data/php
3 doomsday is 20121221
4 function.php handle id=1104
5 CallPhp.test, id=1104 message=guess?
6 CallPhp.call phpLog=
7 java give phpRootDir is data/php
8 doomsday is 20121221
9 function.php handle id=531
10 CallPhp.test, id=531 message=score
11 CallPhp.call phpLog=
12 java give phpRootDir is data/php
13 doomsday is 20121221
14 function.php handle id=1221
15 CallPhp.test, id=1221 message=maybe doomsday
16 CallPhp.call phpLog=
17 java give phpRootDir is data/php
18 doomsday is 20121221
19 function.php handle id=110
20 CallPhp.test, id=110 message=404 not found
(二)注意事项
1. 由于是java调用的php,所以php里当前工作路径变成了java的。
2. FileReader加载*.php文件之后ScriptEngine.evel(FileReader)的耗时大概为230+ms,StringReader时为180+ms,速度都不咋滴,但是这不是我们项目急着考虑的问题,之前的http方式也好不到哪去,优化留到以后再说。
3. php的解释器运行路径配置:-Dphp.java.bridge.php_exec=。
三、相关资料
posted on 2013-04-08 18:20 Sheppard Y 阅读(684) 评论(0) 编辑 收藏 引用 所属分类: 其他语言 、设计架构
php java bridge实例,PHP/Java Bridge的使用相关推荐
- java mapreduce 实例_MapReduce -- JAVA 实例(一)计算总数
MapReduce =========================== 将任务细化,让不同的节点处理不同部分.处理完后,再把各自的结果进行统一.它通过键值对来处理数据.但键和值的类型都有要求. 通 ...
- java hashmap实例,关于java中的HashMap的实例操作
HashMap简介: 1.以(键,值)对存储数据. 2.不允许有重复的键,但允许有重复的值. 3.不同步(多个线程可以同时访问) 相关视频教程推荐:java在线学习 实例演示如下: 1.添加 Hash ...
- java 登陆实例,2021-03-19 java案例:用户登录
需求:已知用户名和密码,请用程序实现模拟用户登录.总共三次机会,登录之后,给出相应的提示. 思路: 1.已知用户名和密码,定义两个字符串即可. 2.键盘录入要登录的用户名和密码,用Scanner实现. ...
- java 布局实例,HarmonyOS Java UI之StackLayout布局示例
StackLayout简介 StackLayout意为堆叠布局,用于在屏幕上保留一个区域来显示组件,实现特殊的功能.通常,堆叠布局中只应该放置一个子组件,如果存在多个子组件,则显示最新的组件.这个布局 ...
- 【Java 代码实例 14】BeanUtils用法详解,附源码分析
目录 一.org.apache.commons.beanutils.BeanUtils简介 二.使用的前置条件 三.添加pom 四.org.apache.commons.beanutils.BeanU ...
- 【Java 代码实例 13】Java操作pdf的工具类itext
目录 一.什么是iText? 二.引入jar 1.项目要使用iText,必须引入jar包 2.输出中文,还要引入下面```itext-asian.jar```包 3.设置pdf文件密码,还要引入下面` ...
- java chinapay_通过PHP/Java Bridge来实现ecshop的chinapay支付接口
背景: 最近弄ecshop网上商城这个系统,需要提供对中国银联支付支持,从网上查了一些资料,发现chinapay对php支持并不是十分友好.需要扩展编译啥的,似乎很麻烦.网上资料不是很多,php实现c ...
- Java Websocket实例【服务端与客户端实现全双工通讯】
Java Websocket实例[服务端与客户端实现全双工通讯] 现很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP ...
- java开发用amd处理器_HBase1.x实战:协处理器Java开发实例--ObserverCoprocessor
微信公众号:大数据开发运维架构 关注可了解更多大数据相关的资讯.问题或建议,请公众号留言; 如果您觉得"大数据开发运维架构"对你有帮助,欢迎转发朋友圈 概述: HBase日常开发中 ...
最新文章
- python随机生成数字_Python 中生成 0 到 9 之间的随机整数
- 读取网络数据缓存在本地 流程图
- JAVA——保持cookie登录状态的HttpClient封装工具类
- 智能导航短信告警的一个逻辑处理
- OC中的几种延迟执行方式
- 【渝粤题库】陕西师范大学152103 公共行政学
- vue+element-ui大文件的分片上传和断点续传js-spark-md5和browser-md5-file
- OS内核参数(SEM)在高负载的Oracle数据库中如何设置
- lisp把多段线顶点连成表_读取多段线顶点并将顶点坐标标到数组中
- (个人)Linux基本指令收集
- python定时重启程序
- 深圳大学计算机考研教材,广东-深圳大学计算机考研院校初试科目及参考书汇总...
- 2019/第十届蓝桥杯国赛/Java-B
- 雅思阅读考点词-同义替换
- 课堂实验一 SQL基础练习
- 社团管理——原型设计
- js打印页面指定区域内容
- 无极性电容和有极性电容的爆炸
- 微信小程序 wxss之 background 属性
- Nginx实现XSS、SQL注入防护 —— 筑梦之路
热门文章
- 无人机倾斜摄影图像地理配准-随笔
- 一文看懂华为新品发布会 折叠屏新机MateXs最抢眼
- python logging学习
- 从box-sizing:border-box属性入手,来了解盒模型
- Visual Assist X用法
- 【LOJ#6202.】 叶氏筛法(EES)
- HDU 5945 Fxx and game 单调队列优化dp
- 如何查看cudnn当前版本_Linux上查看已安装的CUDA和cuDNN版本号
- 计算机组成原理--流水五段式指令流水线(5)
- ​16 个使用 App Bundle 发布应用和游戏的理由