校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 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服務案例詳解的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    欧美乱熟臀69xxxxxx| 欧美日产在线观看| 自拍偷自拍亚洲精品播放| 日韩午夜三级在线| 日本一区二区成人在线| 国产高清一区日本| 欧美日免费三级在线| 欧美一区二区三区公司| 久久精品国产精品亚洲红杏| 99re8在线精品视频免费播放| 欧美日韩小视频| 国产精品免费视频网站| 视频一区国产视频| 国产69精品久久久久毛片| 中文字幕精品一区二区三区精品| 日韩欧美一区中文| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 7878成人国产在线观看| 国产精品色婷婷| 欧美成人性战久久| 日韩天堂在线观看| 欧美精品 日韩| 丰满白嫩尤物一区二区| 性欧美疯狂xxxxbbbb| 国产成人精品免费视频网站| 国产精品久久久久久久蜜臀| 日韩电影一区二区三区四区| 精品国产一区二区三区不卡 | 久久精品亚洲麻豆av一区二区 | 欧美亚洲尤物久久| 日韩国产在线观看| 日日摸夜夜添夜夜添精品视频| 亚洲综合精品自拍| 欧美图片一区二区三区| 成人午夜碰碰视频| 成人一区在线看| 1024精品合集| 国产精品伦一区二区三级视频| 亚洲精品高清在线观看| 国内外成人在线| 亚洲一区精品在线| 一区二区不卡在线播放 | 91.xcao| 欧美日韩综合不卡| 国产.欧美.日韩| 7777精品伊人久久久大香线蕉的| 亚洲日本va在线观看| 色av综合在线| 国产午夜一区二区三区| 亚洲第一会所有码转帖| 国产福利精品一区| 在线欧美一区二区| 亚洲国产精品久久人人爱蜜臀| 成人精品小蝌蚪| 伊人夜夜躁av伊人久久| 国产麻豆欧美日韩一区| 91黄色激情网站| 国产成人在线色| 91色porny蝌蚪| 五月天国产精品| 欧美在线短视频| 欧美色成人综合| 综合久久给合久久狠狠狠97色| 国产成人精品综合在线观看| 日韩一区二区三区视频| 丝袜诱惑亚洲看片| 最新国产の精品合集bt伙计| 成人开心网精品视频| 日韩和欧美一区二区| 色哟哟日韩精品| 国产免费成人在线视频| 亚洲一区二区三区四区五区中文| 色欧美片视频在线观看在线视频| 久久99久久精品欧美| 欧美精品日韩一区| 卡一卡二国产精品| 国产亚洲欧美中文| 大白屁股一区二区视频| 亚洲欧美偷拍卡通变态| 欧美日韩在线播放一区| 日韩电影免费在线看| 337p日本欧洲亚洲大胆色噜噜| 国产麻豆精品在线| 国产精品国产三级国产a| 一本大道av伊人久久综合| 亚洲一区二区三区中文字幕| 成人小视频免费观看| 懂色av一区二区在线播放| 在线观看成人小视频| 亚洲 欧美综合在线网络| 欧美mv日韩mv国产网站| 精一区二区三区| 成人欧美一区二区三区白人| 欧美日韩一区高清| 韩国v欧美v亚洲v日本v| 亚洲特级片在线| 91精品国产高清一区二区三区蜜臀| 国产又黄又大久久| 亚洲女同一区二区| 日韩三级电影网址| 99在线精品一区二区三区| 亚洲精品国产第一综合99久久| 欧美日韩大陆一区二区| 激情小说亚洲一区| 亚洲综合精品自拍| 久久精品一区四区| 精品视频一区二区三区免费| 极品美女销魂一区二区三区免费| 日韩一区欧美一区| 欧美成人免费网站| 91丨九色丨尤物| 美国毛片一区二区| 亚洲欧洲综合另类| 欧美精品一区在线观看| 在线观看av不卡| 国产一区 二区| 午夜国产精品一区| 中文字幕av资源一区| 欧美一区三区二区| 91麻豆国产福利精品| 免费人成精品欧美精品| 成人免费在线视频观看| 日韩欧美国产小视频| 99精品热视频| 国产一区二区三区日韩| 亚洲午夜激情网站| 国产欧美va欧美不卡在线| 欧美一区二区在线播放| 色综合 综合色| 国产美女av一区二区三区| 日日摸夜夜添夜夜添亚洲女人| 18欧美亚洲精品| 久久久99久久| 欧美日韩三级一区二区| 久久99精品久久久久久久久久久久| 亚洲一区二区三区小说| 久久精品一区二区三区不卡| 欧美伦理电影网| 91麻豆国产香蕉久久精品| 国产成人精品在线看| 久久精品噜噜噜成人av农村| 亚洲一区二区三区美女| 国产精品二三区| 久久久精品人体av艺术| 欧美精品一二三区| 在线视频欧美精品| 91在线看国产| 国产99久久久久久免费看农村| 欧美福利视频导航| 激情综合亚洲精品| 欧美人妇做爰xxxⅹ性高电影| 中文字幕一区二区视频| 国产精品综合二区| 欧美成人官网二区| 香蕉久久夜色精品国产使用方法 | 亚洲福利视频三区| 精品一区二区免费| 日韩国产高清影视| 亚洲一级二级三级| 亚洲精品日日夜夜| 国产精品少妇自拍| 国产欧美1区2区3区| 久久亚洲一区二区三区四区| 欧美一区二区福利在线| 欧美人妇做爰xxxⅹ性高电影| 色综合久久精品| 91欧美一区二区| 91丨porny丨首页| 成人黄色小视频| 成+人+亚洲+综合天堂| 成人黄色777网| 成人免费看片app下载| 成人中文字幕合集| 国产高清久久久久| 成人在线综合网| 99久久er热在这里只有精品15 | 精品久久久网站| 欧美日韩高清在线播放| 欧美无砖砖区免费| 欧日韩精品视频| 在线观看国产91| 欧美在线一二三| 91精品国产一区二区人妖| 日韩你懂的在线播放| 精品日韩一区二区| 国产日韩欧美精品在线| 国产精品久久久久一区二区三区共 | 三级不卡在线观看| 日韩高清不卡在线| 九九国产精品视频| 国产成人精品亚洲日本在线桃色| 成人午夜视频在线| 色综合久久精品| 一本大道av伊人久久综合| 色婷婷精品久久二区二区蜜臂av| 成人免费精品视频| 91麻豆国产自产在线观看| 欧美剧情片在线观看| 2022国产精品视频| 国产精品久久久久影院|