一、需求背景

之前介绍过我们项目的架构,由于历史原因,架构演变成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的使用相关推荐

  1. java mapreduce 实例_MapReduce -- JAVA 实例(一)计算总数

    MapReduce =========================== 将任务细化,让不同的节点处理不同部分.处理完后,再把各自的结果进行统一.它通过键值对来处理数据.但键和值的类型都有要求. 通 ...

  2. java hashmap实例,关于java中的HashMap的实例操作

    HashMap简介: 1.以(键,值)对存储数据. 2.不允许有重复的键,但允许有重复的值. 3.不同步(多个线程可以同时访问) 相关视频教程推荐:java在线学习 实例演示如下: 1.添加 Hash ...

  3. java 登陆实例,2021-03-19 java案例:用户登录

    需求:已知用户名和密码,请用程序实现模拟用户登录.总共三次机会,登录之后,给出相应的提示. 思路: 1.已知用户名和密码,定义两个字符串即可. 2.键盘录入要登录的用户名和密码,用Scanner实现. ...

  4. java 布局实例,HarmonyOS Java UI之StackLayout布局示例

    StackLayout简介 StackLayout意为堆叠布局,用于在屏幕上保留一个区域来显示组件,实现特殊的功能.通常,堆叠布局中只应该放置一个子组件,如果存在多个子组件,则显示最新的组件.这个布局 ...

  5. 【Java 代码实例 14】BeanUtils用法详解,附源码分析

    目录 一.org.apache.commons.beanutils.BeanUtils简介 二.使用的前置条件 三.添加pom 四.org.apache.commons.beanutils.BeanU ...

  6. 【Java 代码实例 13】Java操作pdf的工具类itext

    目录 一.什么是iText? 二.引入jar 1.项目要使用iText,必须引入jar包 2.输出中文,还要引入下面```itext-asian.jar```包 3.设置pdf文件密码,还要引入下面` ...

  7. java chinapay_通过PHP/Java Bridge来实现ecshop的chinapay支付接口

    背景: 最近弄ecshop网上商城这个系统,需要提供对中国银联支付支持,从网上查了一些资料,发现chinapay对php支持并不是十分友好.需要扩展编译啥的,似乎很麻烦.网上资料不是很多,php实现c ...

  8. Java Websocket实例【服务端与客户端实现全双工通讯】

    Java Websocket实例[服务端与客户端实现全双工通讯] 现很多网站为了实现即时通讯,所用的技术都是轮询(polling).轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发 出HTTP ...

  9. java开发用amd处理器_HBase1.x实战:协处理器Java开发实例--ObserverCoprocessor

    微信公众号:大数据开发运维架构 关注可了解更多大数据相关的资讯.问题或建议,请公众号留言; 如果您觉得"大数据开发运维架构"对你有帮助,欢迎转发朋友圈 概述: HBase日常开发中 ...

最新文章

  1. python随机生成数字_Python 中生成 0 到 9 之间的随机整数
  2. 读取网络数据缓存在本地 流程图
  3. JAVA——保持cookie登录状态的HttpClient封装工具类
  4. 智能导航短信告警的一个逻辑处理
  5. OC中的几种延迟执行方式
  6. 【渝粤题库】陕西师范大学152103 公共行政学
  7. vue+element-ui大文件的分片上传和断点续传js-spark-md5和browser-md5-file
  8. OS内核参数(SEM)在高负载的Oracle数据库中如何设置
  9. lisp把多段线顶点连成表_读取多段线顶点并将顶点坐标标到数组中
  10. (个人)Linux基本指令收集
  11. python定时重启程序
  12. 深圳大学计算机考研教材,广东-深圳大学计算机考研院校初试科目及参考书汇总...
  13. 2019/第十届蓝桥杯国赛/Java-B
  14. 雅思阅读考点词-同义替换
  15. 课堂实验一 SQL基础练习
  16. 社团管理——原型设计
  17. js打印页面指定区域内容
  18. 无极性电容和有极性电容的爆炸
  19. 微信小程序 wxss之 background 属性
  20. Nginx实现XSS、SQL注入防护 —— 筑梦之路

热门文章

  1. 无人机倾斜摄影图像地理配准-随笔
  2. 一文看懂华为新品发布会 折叠屏新机MateXs最抢眼
  3. python logging学习
  4. 从box-sizing:border-box属性入手,来了解盒模型
  5. Visual Assist X用法
  6. 【LOJ#6202.】 叶氏筛法(EES)
  7. HDU 5945 Fxx and game 单调队列优化dp
  8. 如何查看cudnn当前版本_Linux上查看已安装的CUDA和cuDNN版本号
  9. 计算机组成原理--流水五段式指令流水线(5)
  10. ​16 个使用 App Bundle 发布应用和游戏的理由