• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Sheppard Y

            keep thinking keep coding.

            PHP/Java Bridge的使用

            2016-07-06 日更新 
            此篇博客已經(jīng)遷移到新博客,并做行文檢查和優(yōu)化排版:
            http://blog.clawz.me/2013/01/18/13-php-java-bridge/

             


            一、需求背景

                之前介紹過我們項(xiàng)目的架構(gòu),由于歷史原因,架構(gòu)演變成as<-->java<-->php這樣,java與as通過tcp長連接通信,java與php通過兩條http通道來通信(java與php各自有個http server,并各自作為對方的http client,java轉(zhuǎn)發(fā)as以前的post給php;php需要跨session推送或者廣播時變?yōu)閔ttp client向java的http server做post)。

                這之前的架構(gòu)是as的功能邏輯大部分直接與php進(jìn)行http通信。

                項(xiàng)目的目標(biāo)是慢慢將php部分寫的糟糕的已有邏輯(例如幫派這種交互和廣播同步比較多的)改到j(luò)ava服務(wù)器上。項(xiàng)目人員配備跟不上,所以不能一下子全轉(zhuǎn)了。

                如果用之前的兩條http通道來小步快跑式的移邏輯,就需要再封裝這兩個通道之間的通信,費(fèi)時間還不一定好使,所以我們需要一個java直接調(diào)用php的技術(shù)。

                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, example
            12  * @author sheppard(ysf1026@gmail.com) 2013-01-18
            13  *
            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  * 腳本統(tǒng)一入口
             6  * @author sheppard(ysf1026@gmail.com) 2013-01-18
             7  *
             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-18
             7  *
             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

             

            (二)注意事項(xiàng)

            1. 由于是java調(diào)用的php,所以php里當(dāng)前工作路徑變成了java的。

            2. FileReader加載*.php文件之后ScriptEngine.evel(FileReader)的耗時大概為230+ms,StringReader時為180+ms,速度都不咋滴,但是這不是我們項(xiàng)目急著考慮的問題,之前的http方式也好不到哪去,優(yōu)化留到以后再說。

            3. php的解釋器運(yùn)行路徑配置:-Dphp.java.bridge.php_exec=。

             

            三、相關(guān)資料

            1. 官網(wǎng):http://php-java-bridge.sourceforge.net/pjb/

            2. 符合java調(diào)腳本標(biāo)準(zhǔn)的調(diào)php示例:http://php-java-bridge.sourceforge.net/pjb/examples/source.php?source=PhpThreads.java


            ps:2013年1月18日我在CU的博客

             

             

             

             

            posted on 2013-04-08 18:20 Sheppard Y 閱讀(946) 評論(0)  編輯 收藏 引用 所屬分類: 其他語言設(shè)計(jì)架構(gòu)

            <2013年4月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(1)

            隨筆分類(77)

            隨筆檔案(58)

            me

            基友

            同行

            業(yè)界前輩

            最新隨筆

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            亚洲av日韩精品久久久久久a | 久久婷婷五月综合色99啪ak| 久久国产美女免费观看精品| 亚洲精品无码久久久久AV麻豆| 精品久久久久久国产| 国产精品无码久久综合| 久久久精品波多野结衣| 久久天天躁狠狠躁夜夜网站| 99久久www免费人成精品| 99精品国产99久久久久久97| 色综合久久综合网观看| 久久久久亚洲国产| 丁香久久婷婷国产午夜视频| 三上悠亚久久精品| 香港aa三级久久三级老师2021国产三级精品三级在 | 精品久久久久久中文字幕大豆网| 精品精品国产自在久久高清| 久久人妻无码中文字幕| 免费一级欧美大片久久网| 97久久超碰成人精品网站| 97精品依人久久久大香线蕉97| 久久精品国产99久久久香蕉| 久久被窝电影亚洲爽爽爽| 久久婷婷国产综合精品| 久久亚洲AV成人无码软件| 午夜精品久久久久久影视777| 国产福利电影一区二区三区久久老子无码午夜伦不 | 青青草原1769久久免费播放| 久久精品无码专区免费青青| 久久精品无码午夜福利理论片| 思思久久好好热精品国产| 香蕉久久久久久狠狠色| 青青草国产97免久久费观看| 国产精品99久久久久久宅男| 久久国产午夜精品一区二区三区| 久久成人影院精品777| 久久亚洲国产精品一区二区| 2021国产成人精品久久| 国产综合免费精品久久久| 久久人妻少妇嫩草AV蜜桃| 国产色综合久久无码有码|