• <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長(zhǎng)連接通信,java與php通過兩條http通道來通信(java與php各自有個(gè)http server,并各自作為對(duì)方的http client,java轉(zhuǎn)發(fā)as以前的post給php;php需要跨session推送或者廣播時(shí)變?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通道來小步快跑式的移邏輯,就需要再封裝這兩個(gè)通道之間的通信,費(fèi)時(shí)間還不一定好使,所以我們需要一個(gè)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)的耗時(shí)大概為230+ms,StringReader時(shí)為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) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 其他語(yǔ)言設(shè)計(jì)架構(gòu)

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(1)

            隨筆分類(77)

            隨筆檔案(58)

            me

            基友

            同行

            業(yè)界前輩

            最新隨筆

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            久久国产成人午夜aⅴ影院 | 久久精品午夜一区二区福利| 国内精品久久久久影院老司| 国内精品九九久久精品 | 国产成人无码精品久久久久免费 | 色综合久久天天综线观看| 欧美日韩精品久久久久| 久久亚洲精品中文字幕| 久久精品国产亚洲AV嫖农村妇女| 狠狠色丁香久久婷婷综合五月| 国产精品久久久久影视不卡| 国内精品免费久久影院| 久久se精品一区精品二区| 2021久久精品国产99国产精品| 亚洲色欲久久久综合网| 久久亚洲中文字幕精品一区| 国产A三级久久精品| 国产精品久久精品| 综合久久精品色| 婷婷综合久久中文字幕蜜桃三电影| 波多野结衣中文字幕久久| 久久一区二区三区免费| 久久综合亚洲欧美成人| 狠狠色伊人久久精品综合网| 久久亚洲精品中文字幕| 伊人色综合久久天天人守人婷| 免费精品久久天干天干| 久久Av无码精品人妻系列| 久久99精品国产| 久久棈精品久久久久久噜噜| 久久这里有精品视频| 久久精品亚洲一区二区三区浴池| 香蕉aa三级久久毛片| 四虎国产永久免费久久| 久久99久久99精品免视看动漫| 久久久久久国产a免费观看黄色大片| 成人资源影音先锋久久资源网| 色欲综合久久中文字幕网| 久久久久亚洲AV无码专区首JN| 女同久久| 久久久亚洲欧洲日产国码是AV|