欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > PHP創建簡單RPC服務案例詳解

PHP創建簡單RPC服務案例詳解

熱門標簽:400電話個人能不能辦理 手機外呼系統什么原理 溫州外呼系統招商 凱立德地鐵站地圖標注 合肥ai電銷機器人費用 上海400客服電話怎么申請 天津電銷外呼系統違法嗎 滄州電銷外呼系統價格 銀行信貸電話機器人

RPC 定義

RPC(Remote Procedure Call)即遠程過程調用,指被調用方法的具體實現不在程序運行本地,而是在別的某個地方。主要應用于不同的系統之間的遠程通信和相互調用。

如 A 調用 B 提供的 remoteAdd 方法:

  1. 首先A與B之間建立一個TCP連接;
  2. 然后A把需要調用的方法名(這里是remoteAdd)以及方法參數(10, 20)序列化成字節流發送出去;
  3. B接受A發送過來的字節流,然后反序列化得到目標方法名,方法參數,接著執行相應的方法調用(可能是localAdd)并把結果30返回;
  4. A接受遠程調用結果

有些遠程調用選擇比較底層的 socket 協議,有些遠程調用選擇比較上層的 HTTP 協議。

遠程調用的好處:

  • 解耦:當方法提供者需要對方法內實現修改時,調用者完全感知不到,不用做任何變更;這種方式在跨部門,跨公司合作的時候經常用到,并且方法的提供者我們通常稱為:服務的暴露方

這里使用 PHP Socket 來創建一個服務端和客戶端,目錄結構如下:

服務端 

?php
class RpcServer {
    protected $server = null;

    public function __construct($host, $port, $path)
    {
        // 創建一個 Socket 服務
        if(($this->server = socket_create(AF_INET,SOCK_STREAM,SOL_TCP))  0) {
            exit("socket_create() 失敗的原因是:".socket_strerror($this->server)."\n");
        }
        if(($ret = socket_bind($this->server,$host,$port))  0) {
            exit("socket_bind() 失敗的原因是:".socket_strerror($ret)."\n");
        }
        if(($ret = socket_listen($this->server,3))  0) {
            exit("socket_listen() 失敗的原因是:".socket_strerror($ret)."\n");
        }

        // 判斷 RPC 服務目錄是否存在
        $realPath = realpath(__DIR__ . $path);
        if ($realPath === false || !file_exists($realPath)) {
            exit("{$path} error \n");
        }

        do {
            $client = socket_accept($this->server);
            if($client) {
                // 一次性讀取
                $buf = socket_read($client, 8024);
                echo $buf;

                //解析客戶端發送過來的協議
                $classRet = preg_match('/Rpc-Class:\s(.*);\r\n/i', $buf, $class);
                $methodRet = preg_match('/Rpc-Method:\s(.*);\r\n/i', $buf, $method);
                $paramsRet = preg_match('/Rpc-Params:\s(.*);\r\n/i', $buf, $params);

                if($classRet  $methodRet) {
                    $class = ucfirst($class[1]);
                    $method = $method[1];
                    $params = json_decode($params[1], true);
                    $file = $realPath . '/' . $class . '.php';  // 類文件需要和類名一致
                    $data = ''; // 執行結果
                    // 判斷類文件是否存在
                    if(file_exists($file)) {
                        // 引入類文件
                        require_once $file;
                        // 實例化類
                        $rfc_obj = new ReflectionClass($class);
                        // 判斷該類指定方法是否存在
                        if($rfc_obj->hasMethod($method)) {
                            // 執行類方法
                            $rfc_method = $rfc_obj->getMethod($method);
                            $data = $rfc_method->invokeArgs($rfc_obj->newInstance(), [$params]);
                        } else {
                            socket_write($client, 'method error');
                        }
                        //把運行后的結果返回給客戶端
                        socket_write($client, $data);
                    }
                } else {
                    socket_write($client, 'class or method error');
                }

                // 關閉客戶端
                socket_close($client);
            }

        }while(true);
    }

    public function __destruct()
    {
        socket_close($this->server);
    }
}

new RpcServer('127.0.0.1',8080,'./service');

客戶端

?php
class RpcClient {
    protected $client = null;
    protected $url_info = [];   // 遠程調用 URL 組成部分

    public function __construct($url)
    {
        // 解析 URL
        $this->url_info = parse_url($url);
    }

    public function __call($name, $arguments)
    {
        // 創建一個客戶端
        $this->client = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if(!$this->client) {
            exit('socket_create() 失敗');
        }
        socket_connect($this->client, $this->url_info['host'], $this->url_info['port']);

        // 傳遞調用的類名
        $class = basename($this->url_info['path']);
        // 傳遞調用的參數
        $args = '';
        if(isset($arguments[0])) {
            $args = json_encode($arguments[0]);
        }
        // 向服務端發送我們自定義的協議數據
        $proto = "Rpc-Class: {$class};".PHP_EOL
            ."Rpc-Method: {$name};".PHP_EOL
            ."Rpc-Params: {$args};".PHP_EOL;
        socket_write($this->client, $proto);
        // 讀取服務端傳來的數據
        $buf = socket_read($this->client, 8024);
        socket_close($this->client);
        return $buf;
    }
}

$rpcClient = new RpcClient('http://127.0.0.1:8080/news');
echo $rpcClient->display(['title'=>'txl']);
echo $rpcClient->display(['title'=>'hello world']);

服務類 News

?php
class News {
    public function display($data)
    {
        return json_encode(['result'=>"News display(), title is {$data['title']}"]);
    }
}

運行測試:

Client

Server

到此這篇關于PHP創建簡單RPC服務案例詳解的文章就介紹到這了,更多相關PHP創建簡單RPC服務內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 詳解php中流行的rpc框架
  • php實現的一個簡單json rpc框架實例
  • PHP采用XML-RPC構造Web Service實例教程
  • AMFPHP php遠程調用(RPC, Remote Procedure Call)工具 快速入門教程
  • php xml-rpc遠程調用

標簽:白城 赤峰 洛陽 酒泉 七臺河 金華 溫州 怒江

巨人網絡通訊聲明:本文標題《PHP創建簡單RPC服務案例詳解》,本文關鍵詞  PHP,創建,簡單,RPC,服務,案例,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP創建簡單RPC服務案例詳解》相關的同類信息!
  • 本頁收集關于PHP創建簡單RPC服務案例詳解的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    久久综合色之久久综合| 亚洲成a人在线观看| 久久精品国产成人一区二区三区| 国产51自产区| 欧美在线观看一区| 亚洲黄色免费网站| av男人天堂一区| 色欧美88888久久久久久影院| 亚洲欧洲日韩av| www.成人网.com| 色欧美88888久久久久久影院| 亚洲欧洲日韩av| 99精品一区二区三区| 欧美影视一区二区三区| 亚洲一区二区三区在线看| 欧美性猛交乱大交| 7777精品伊人久久久大香线蕉经典版下载 | 久久免费电影网| 国内精品伊人久久久久av影院| 人与嘼交av免费| 欧美国产日韩一二三区| 成人污视频在线观看| 色婷婷综合久久久中文一区二区| 亚洲桃色在线一区| 男人的天堂免费| 欧美一区二区三区四区五区| 毛片不卡一区二区| 少妇愉情理伦三级| 国产精品久久久久久久久免费相片 | 91精品国产免费| 裸体健美xxxx欧美裸体表演| 色屁屁草草影院ccyy.com| 中文字幕欧美三区| 91浏览器入口在线观看| 7777精品伊人久久久大香线蕉完整版 | 亚洲成av人**亚洲成av**| www.超碰97| 久久精品综合网| 不卡一区二区三区四区| 欧美色精品在线视频| 日本在线不卡视频一二三区| x88av在线| 亚洲视频免费观看| 亚洲av成人片无码| 2023国产精品视频| av在线一区二区| 91精选在线观看| 国产麻豆91精品| 欧美在线小视频| 蜜臀国产一区二区三区在线播放| 激情无码人妻又粗又大| 亚洲精品日日夜夜| 91网站免费视频| 中文字幕亚洲精品在线观看| 北京富婆泄欲对白| 久久久久久久久久美女| 91免费版在线| 久久亚洲二区三区| 成+人+亚洲+综合天堂| 欧美一区二区免费观在线| 国产成人免费在线视频| 欧美男男青年gay1069videost| 国产在线看一区| 欧美日韩一本到| 国产精品伊人色| 欧美精品日日鲁夜夜添| 国产精品自在在线| 777久久久精品| 成人免费va视频| 日韩美女天天操| 91在线小视频| 久久亚洲综合色一区二区三区| 免费人成视频在线播放| 久久久午夜精品| av av在线| 亚洲欧洲www| 性欧美一区二区| 亚洲图片欧美视频| 我要看黄色一级片| 麻豆精品视频在线观看免费 | 激情小说欧美图片| 欧美图区在线视频| 国产成人午夜视频| 欧美成人激情免费网| 日本人dh亚洲人ⅹxx| 久久久久久久久久久久电影| www.17c.com喷水少妇| 成人免费在线播放视频| 神马久久久久久久久久久| 亚洲成人免费视频| 在线视频亚洲一区| 高清国产一区二区三区| 欧美精品一区二区在线观看| 国产视频精品视频| 亚洲精品中文在线观看| 麻豆网址在线观看| 精品无码三级在线观看视频| 欧美一区二区三区在线观看| 91麻豆123| 亚洲色图欧美在线| 男人在线观看视频| 国产一区二区成人久久免费影院 | 欧美亚一区二区| 成人国产精品免费| 日本一区二区在线不卡| 亚洲v国产v欧美v久久久久久| 亚洲成av人片一区二区| 欧美丝袜第三区| 99国产精品国产精品毛片| 亚洲国产精品v| 超碰97av在线| 狠狠网亚洲精品| 久久综合色一综合色88| 91网站免费视频| 美女视频黄 久久| 日韩精品在线一区| 草草地址线路①屁屁影院成人| 无吗不卡中文字幕| 884aa四虎影成人精品一区| 熟妇女人妻丰满少妇中文字幕| 亚洲九九爱视频| 在线观看视频欧美| 久久久久无码精品| 一区二区三区免费观看| 欧美无乱码久久久免费午夜一区| 91啪亚洲精品| 一区二区三区成人在线视频| 欧美午夜电影在线播放| 2018国产精品| 天天综合色天天综合色h| 678五月天丁香亚洲综合网| 大乳护士喂奶hd| 蜜桃久久久久久| 久久一二三国产| 久久嫩草捆绑紧缚| 成人福利视频在线| 一区二区三区不卡视频在线观看| 欧美色老头old∨ideo| 好男人香蕉影院| 日本欧美在线观看| www国产精品av| 久久噜噜色综合一区二区| 成人动漫视频在线| 一区二区三区91| 欧美一区二区三区在线观看 | 在线免费日韩av| 手机看片国产精品| 五月综合激情日本mⅴ| 日韩免费高清视频| 极品尤物一区二区| www.久久精品| 亚洲va天堂va国产va久| 精品福利一区二区三区| 一级性生活免费视频| 99久久综合狠狠综合久久| 亚洲国产精品一区二区久久| 日韩美女视频在线| 麻豆网址在线观看| 91精品国产高清91久久久久久| 日韩激情一区二区| 国产午夜精品福利| 色偷偷久久一区二区三区| av天堂一区二区| 精品亚洲成a人在线观看| 国产精品麻豆视频| 欧美日韩在线亚洲一区蜜芽| 精品久久久久久中文字幕人妻最新| 国内久久婷婷综合| 亚洲精品成人精品456| 日韩三级精品电影久久久| 久久精品色妇熟妇丰满人妻| 99久久免费精品高清特色大片| 亚洲成av人片在线| 日本一区二区三区在线不卡| 欧美午夜精品一区二区三区| av在线网站观看| 成人av动漫在线| 免费一级片91| 国产精品久久久久影院老司| 欧美精品三级日韩久久| fc2ppv在线播放| 国产白嫩美女无套久久| 大尺度一区二区| 日韩影院免费视频| 亚洲欧洲av色图| 日韩亚洲欧美一区二区三区| 欧美黑人性猛交xxx| 捆绑凌虐一区二区三区| 懂色av一区二区三区免费观看| 婷婷成人激情在线网| 亚洲AV无码国产精品| 成人免费视频一区| 日本va欧美va欧美va精品| 综合自拍亚洲综合图不卡区| 欧美一级片在线看| 色偷偷久久人人79超碰人人澡| 久久久久久国产精品无码| 性生活一级大片| 国产精品538一区二区在线| 五月婷婷久久丁香|