日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

PHP实现RPC(简版)

發布時間:2024/8/23 php 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP实现RPC(简版) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

概述

RPC這個東西是什么? 第一次聽說他, 還要在它的前邊加個G, 當時我以為GRPC是一項技術, 后來才知道, 并不是這樣. GRPC只是RPC的谷歌實現.

谷歌搜了一下, RPC就是一種: 遠程函數調用, 看到這里, 我已經等不及了, 不往下看了, 先自己實現一個. 如果只給你這樣一個概念, 如何實現調用遠程函數的功能呢?

自己實現

自己嘗試實現一個粗糙的PHP版本. (不想看可以跳過的)

思路

遠程調用, 只需要解決下面問題:

  • 通信問題
  • 定義傳輸的數據格式
  • 如何封裝后可以達到像調用本地函數一樣的效果
  • 先來解決通信問題, 直接粗暴的tcp socket

    傳輸的數據格式, 直接用json進行傳輸

    調用本地函數?? 這就要借助一下PHP的魔術函數了, __call() 這個函數是一個類調用不存在的方法時會跑到這里來, 所以, 我們返回一個類, 在call方法中進行遠程調用, 這樣, 在本地看來就只是在調用一個方法.

    開始實現

    PHP中進行socket連接十分簡單, 直接調用系統函數. 通信問題解決了, 剩下的就是傳輸數據了, so easy

    經過一番摸索, 看下結果

    服務器內容:

    <?php class RpcServer{private $port = 0; // 監聽端口號private $host = ''; // IPpublic function __construct($host, $port){$this->host = $host;$this->port = $port;}/*** 運行, 監聽端口并處理*/public function run(){// 創建socket$server = stream_socket_server("tcp://{$this->host}:{$this->port}");if(empty($server)) throw new Exception('創建套接字失敗');// 監聽while (true){$client = stream_socket_accept($server);if(empty($client)) continue;// 處理請求$this->disposeClient($client);fclose($client);}}private function disposeClient($client){$buf = fread($client, 4096);$array = json_decode($buf, true);// 創建對象并調用方法$class = $array['class'] ?? '';$method = $array['method'] ?? '';$params = $array['params'] ?? [];$instance = new $class();$result = $instance->$method(...$params);fwrite($client, json_encode($result));} } // 測試調用類 class Test{public function tt(){return 'return_tt';}public function add($a, $b){return $a + $b;} }(new RpcServer('127.0.0.1', 8888))->run();

    調用方:

    <?php class RpcClient{private $urlInfo = null;private $className = '';private function __construct($url, $className){$this->urlInfo = parse_url($url);$this->className = $className;}public static function getInstance($className){return new RpcClient('127.0.0.1:8888', $className);}public function __call($name, $arguments){// 創建客戶端$client = stream_socket_client("tcp://{$this->urlInfo['host']}:{$this->urlInfo['port']}");if(empty($client)) return null;// 發送數據fwrite($client, json_encode(['class' => $this->className,'method' => $name,'params' => $arguments,]));// 接收返回$data = fread($client, 4096);// 關閉客戶端fclose($client);return json_decode($data, true);} }$test = RpcClient::getInstance('Test'); echo $test->tt(), PHP_EOL; echo $test->add(4, 6);

    結果:

    嗯, 還闊以. 當然, 問題還是有很多的, 比如不能實現保存對象的修改狀態等等.

    其實對象可以通過序列化和反序列化來傳輸, 額, Java中, 不知道PHP有沒有這種技術.

    當然, 一個RPC中必然大量使用反射、序列化、動態加載、代理、網絡請求等等, 這只是一個超級超級粗糙的示例.

    繼續

    nice, 自己做完了, 對RPC是個什么東西有了一個基本的概念.

    WHAT

    RPC是什么? 簡單說, 就是遠程函數調用. 字面意思, 很好理解.

    WHY

    看到一個技術, 一定會問的一個問題就是: 為什么? 一個技術基本不會平白無故出現, 都是為了解決某些問題, 那么RPC解決了什么問題呢? 字面含義: 遠程函數調用

    為什么要進行遠程函數調用, 把函數拿過來本地調用不就好了? 還不用走網絡IO, 速度更快一些. 很好, 現在假設, 你真的這樣做了, 當項目變得龐大, 你想要進行拆分, 拆分后的有: 項目A, 項目B…, 這時, 你發現這些拆分的項目部分邏輯是重疊的, 比如用戶信息相關, 怎么辦? 如果不抽出來, 以后的維護成本會變得很高, 一處改處處改. 如果抽出來, 跨項目如何進行調用? 哎, 走過路過不要錯過, RPC推薦給你.

    HOW

    那么如何實現RPC呢?

    在剛才使用PHP簡單實現中, 已經發現了. 需要解決的問題如下:

  • 網絡通信
  • 信息格式
  • 對象狀態保存
  • 1.網絡通信

    說到底, 網絡通信不過兩種: tcp udp.

    有沒有使用udp實現的RPC呢? 貌似也有.

    使用tcp協議實現的RPC也有, 當然, 不光傳輸層協議, 也有直接通過應用層協議: http、websocket等等建立連接的. 當然, 如果需要頻繁調用, 可以不斷開tcp連接, 在一段時間內一直保持連接, 避免頻繁握手.

    2.信息格式

    信息格式就有很多選擇了, jsonxml等等, 也可以自己定制, 只要發送端和接收端統一信息格式就行了.

    3.對象狀態保存

    對于一個類的調用, 通常都會有類狀態修改的操作, 比如調用setName方法, 如何保存對象的信息呢? 當然, 可以服務端將對象在內存中的信息直接序列化發回去, 當客戶端下次調用時攜帶序列化信息, 服務端接收后反序列化還原對象繼續操作.

    過程

    個人理解的RPC調用過程:

  • 客戶端創建RPC對象
  • 客戶端調用方法
  • RPC解析方法并將對象及參數做序列化
  • RPC通過網絡連接發送方法調用
  • 服務端接收到方法調用, 解析對象及參數反序列化
  • 服務端執行方法并將結果序列化返回
  • 客戶端接收到結果并進行解析, 返回給本地調用者
  • 拿到最終結果

  • RPC適用于內部網絡不同項目之間的通信, 如果是對外暴露的, 個人感覺還是通過接口的形式吧.

    使用RPC顯然會喪失一部分性能, 畢竟調用要走網絡IO, 盡管是內網, 仍然要比本地調用慢上一些, 但帶來了更好的可擴展性和可維護性, 感覺還是不錯的.

    之后如果用到的話, 拉個框架看看源碼.

    個人理解, 以上…

    創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

    總結

    以上是生活随笔為你收集整理的PHP实现RPC(简版)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 视频二区在线 | 色中文| 青青草自拍偷拍 | 国产熟妇另类久久久久 | 亚洲性欧美 | 嫩草99| 男女免费视频网站 | 99福利视频 | 韩国毛片视频 | 中文字幕日韩一区二区三区 | 草久久久| 日本美女a级片 | 久久成人a| 香蕉午夜视频 | 丁香婷婷综合网 | 韩国成人在线视频 | 国产又粗又黄又爽 | 亚洲毛片一区 | 亚洲色图制服诱惑 | 亚洲国产丝袜 | 国产精品日日摸天天碰 | 国内精品小视频 | 国产a免费 | 91传媒入口| 欧美tickle狂笑裸体vk | 国产无遮挡呻吟娇喘视频 | 国产98色在线 | 日韩 | 男人的天堂2018 | 精品福利影院 | 色丁香综合 | 69国产| 国产精品嫩草影院精东 | 欧美日韩中文字幕在线播放 | 国产乱真实合集 | 国内自拍av | 成人免费性视频 | 久久久国产精品无码 | 午夜精品久久久久久久91蜜桃 | 亚洲va欧美va天堂v国产综合 | 男插女视频网站 | 一级国产片 | 动漫女生光屁股 | 国产在线不卡一区 | 国产午夜精品无码一区二区 | 精品视频无码一区二区三区 | 日韩毛片高清在线播放 | 青青草十七色 | 91精品婷婷国产综合久久蝌蚪 | 性欧美色图 | 午夜激情福利视频 | 性高潮久久久久久久 | 亚洲精品aaa | 亚洲福利视频一区二区三区 | 国产成人av一区二区三区在线观看 | 青青草国产在线播放 | 亚洲一区二区在线免费 | 91久久精品一区二区别 | 国产精品爱啪在线线免费观看 | 日韩国产二区 | 国产精品xxx在线观看 | 亚洲欧美www | 欧美精品色哟哟 | 成人在线你懂的 | 亚洲乱妇老熟女爽到高潮的片 | 无码精品一区二区三区AV | 成人免费精品视频 | 日本天堂网在线观看 | 啪啪视屏 | 人妖天堂狠狠ts人妖天堂狠狠 | 亚洲资源在线观看 | 国产午夜伦理 | 三级av片| 99小视频 | 男女国产精品 | 玖玖网 | 水牛影视av一区二区免费 | sese视频在线观看 | av黄色免费网站 | 一区免费在线观看 | 久久乐国产精品 | 日本激情影院 | 国产三级精品视频 | 五月天三级 | 天天干天天操心 | 国产不卡视频一区二区三区 | 亚洲第6页 | 最近日韩免费视频 | a√国产| 可以免费看黄的网站 | 黄色的一级片 | 夜夜爽夜夜 | 欧美黄色免费在线观看 | 2021天天干| 亚洲欧洲一区二区在线观看 | 欧美精品一区二区三区在线播放 | 亚洲综合色在线 | 久久偷看各类女兵18女厕嘘嘘 | 天天操天天曰 | 亚洲人免费 |