成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

PHP 教父鳥哥 Yar 的原理分析

B0B0 / 3362人閱讀

摘要:下面一起學習下鳥哥的框架。揭開神秘面紗采用客戶端服務器模式。在服務器端,進程保持睡眠狀態(tài)直到調用信息的到達為止。這和我們外網的原理不都一個樣么那么我們一起看看高大上的是怎么在玩。整個傳輸以二進制流的形式傳送。

各位老鐵在點贊、收藏的時候敢不敢報名小弟的直播分享,絕對有干貨,絕對有驚喜!
一次早餐錢的投入,可能是薪資的翻倍,可能是視野的拓展!

PHP 進階之路 - 億級 pv 網站架構的技術細節(jié)與套路

PHP 進階之路 - 億級 pv 網站架構實戰(zhàn)之性能壓榨

PHP 進階之路 - 后端多元化之快速切入 Java 開發(fā)

模塊越來越多,業(yè)務越來越復雜,RPC 就上場了,在 PHP 的世界里,鳥哥的作品一直備受廣大網友的青睞。下面一起學習下鳥哥的 PRC 框架 Yar 。

揭開 Yar 神秘面紗

RPC 采用客戶端/服務器模式。首先,客戶機調用進程發(fā)送一個有進程參數(shù)的調用信息到服務進程,然后等待應答信息。在服務器端,進程保持睡眠狀態(tài)直到調用信息的到達為止。當一個調用信息到達,服務器獲得進程參數(shù),計算結果,發(fā)送答復信息,然后等待下一個調用信息,最后,客戶端調用進程接收答復信息,獲得進程結果,然后調用執(zhí)行繼續(xù)進行。
這和我們外網 api 的原理不都一個樣么?那么我們一起看看高大上的 Yar 是怎么在玩。

Yar 功能演示

客戶端代碼,假設該服務設在局域網10.211.55.4

 "http://10.211.55.4/yar/server/RewardScoreService.class.php",
    );
 
    public static function init($server){
        if (array_key_exists($server, self::$rpcConfig)) {
            $uri = self::$rpcConfig[$server];
            return new Yar_Client($uri);
        }
    }
}
 
$RewardScoreService = RpcClient::init("RewardScoreService");
var_dump($RewardScoreService->support(1, 2));

服務器端代碼

handle();

訪問結果如下

uid = 1, feedId = 2
Yar 遠程調用的實現(xiàn)原理

實際呢,yar client 是通過__call這個魔術方法來實現(xiàn)遠程調用的,在Yar_client類里面并沒有任何方法,當我們在調用一個不存在的方式的時候,就會執(zhí)行__call方法,這個在框架中非常常見。

Yar 協(xié)議分析

在 yar 中規(guī)定的傳輸協(xié)議如下圖所示,請求體為82個字節(jié)的yar_header_t和8字節(jié)的打包名稱和請求實體yar_request_t,在yar_header_t里面用body_len記錄8字節(jié)的打包名稱+請求實體的長度;返回體類似,只是實體內容的結構體稍微不同,在reval里面才是實際最后客戶端需要的結果。

整個傳輸以二進制流的形式傳送。

Yar 數(shù)據(jù)傳輸?shù)恼w流程分析

yar_transport.h中,定義了yar_transport_t結構體,先不考慮并行處理的接口,以socket傳輸協(xié)議為例子學習,代碼簡化一些如下:

typedef struct _yar_transport_interface {
    void *data;
    int  (*open)(struct _yar_transport_interface *self, char *address, uint len, long options, char **msg TSRMLS_DC);
    int  (*send)(struct _yar_transport_interface *self, struct _yar_request *request, char **msg TSRMLS_DC);
    struct _yar_response * (*exec)(struct _yar_transport_interface *self, struct _yar_request *request TSRMLS_DC);
    int  (*setopt)(struct _yar_transport_interface *self, long type, void *value, void *addition TSRMLS_DC);
    int  (*calldata)(struct _yar_transport_interface *self, yar_call_data_t *calldata TSRMLS_DC);
    void (*close)(struct _yar_transport_interface *self TSRMLS_DC);
} yar_transport_interface_t;
 
 
typedef struct _yar_transport {
    const char *name;
    struct _yar_transport_interface * (*init)(TSRMLS_D);
    void (*destroy)(yar_transport_interface_t *self TSRMLS_DC);
    yar_transport_multi_t *multi;
} yar_transport_t;

然后在transports/socket.c中定義了yar_transport_socket

yar_transport_t yar_transport_socket = {
    "sock",
    php_yar_socket_init,
    php_yar_socket_destroy,
};

整理了整體的執(zhí)行流程如下圖

Yar 數(shù)據(jù)的打包和解包

鳥哥在yar_packager.c中首先定義了一個結構體,初始化的時候會把各個yar_packager_t注冊到**packagers數(shù)組中。

struct _yar_packagers_list {
    unsigned int size;
    unsigned int num;
    yar_packager_t **packagers;
} yar_packagers_list;
typedef struct _yar_packager {
    const char *name;
    int  (*pack) (struct _yar_packager *self, zval *pzval, smart_str *buf, char **msg TSRMLS_DC);
    zval * (*unpack) (struct _yar_packager *self, char *content, size_t len, char **msg TSRMLS_DC);
} yar_packager_t;

然后通過傳入的nameyar_packager_tname做比較,相同則返回該實例

PHP_YAR_API yar_packager_t * php_yar_packager_get(char *name, int nlen TSRMLS_DC) /* {{{ */ {
    int i = 0;
    for (;iname, name, nlen) == 0) {
            return yar_packagers_list.packagers[i];
        }
    }
 
    return NULL;
} /* }}} */

親密接觸完畢。紙上得來終覺淺,絕知此事要躬行。這篇博客只能是輔助大家在看源碼時一起分析,覺不能拋開源碼僅僅看這篇博客。

怎么樣才能對這個內容真正的掌握呢,所以我有折騰了一個Java 版本的客戶端,這樣總算有所收獲,這份代碼也和我們平常寫的業(yè)務邏輯還是有些區(qū)別,二進制的東西居多,整個過程下來對網絡數(shù)據(jù)的傳輸有了更深刻的理解和學習哈。

Github 項目地址: https://github.com/zhoumengka...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://m.hztianpu.com/yun/23242.html

相關文章

  • phpcms 里面 Yar 使用

    摘要:的框架的話語言的話首選的當然是鳥哥的,支持并行等等,總之有很多優(yōu)點。首先查看了鳥哥的文章并行的框架,對的基本原理有了一個認識,做了一個簡單的請求頁面,具體見鳥哥博客,沒問題,接下來就是對現(xiàn)有項目的改造了。最后感謝鳥哥寫出這么牛掰的東西。 公司新上了個頻道,需要我負責的幾個頻道提供接口,因為進度比較趕,就直接寫了web的 http 接口供同事訪問。 后來訪問量越來越大,出現(xiàn)了很多問題,...

    chnmagnus 評論0 收藏0
  • 并行RPC框架(Concurrent RPC Framework) Yar Java Client

    摘要:客戶端并行調用這兩個服務這里的方法的命令皆以原版為準則。回調函數(shù)需要繼承實現(xiàn)里面定義了兩個方法是針對并行調用發(fā)出之后立即執(zhí)行的任務,而則是每個請求之后返回的結果。 簡介 Yar 是一個輕量級, 高效的 RPC 框架, 它提供了一種簡單方法來讓 PHP 項目之間可以互相遠程調用對方的本地方法. 并且 Yar 也提供了并行調用的能力. 可以支持同時調用多個遠程服務的方法.Yar 鳥哥博客介...

    wh469012917 評論0 收藏0
  • 服務治理深入淺出(2)- 遠程方法調用實現(xiàn)

    摘要:需求在了解了前面我們關于服務治理出現(xiàn)的必要性之后。我們知道服務治理是建立在眾多服務基礎之上的,那么,第一步,打通這些服務是基礎,也就是我們常說的遠程調用。上面執(zhí)行遠程調用也類似。 需求 在了解了前面我們關于服務治理出現(xiàn)的必要性之后。我們知道服務治理是建立在眾多服務基礎之上的,那么,第一步,打通這些服務是基礎,也就是我們常說的 RPC 遠程調用。要像調用本地方法一樣調用遠程服務器上的方法...

    hidogs 評論0 收藏0
  • 為什么鳥哥說 int 再怎么隨機也申請不到奇數(shù)地址

    摘要:棧上各個變量申請的內存,返回的地址是這段連續(xù)內存的最小的地址。為什么用一個位的十六進制來呢因為個字節(jié),一個字節(jié)有位,每位有兩個狀態(tài),那么就是,也就是。為什么用,純屬演示方便。結構體里的字節(jié)對齊以成員中自身對齊值最大的那個值為標準。 原文:我的個人博客 https://mengkang.net/1046.html初中級 phper 有多久沒給自己充電了呢,安利一波我的直播 PHP 進階之...

    klinson 評論0 收藏0
  • SOA面向服務基礎

    摘要:面向服務面向服務的基礎面向服務的三層應用層,服務層,數(shù)據(jù)層應用層用于給用戶展示,,,,安卓。在服務器端,進程保持睡眠狀態(tài)直到調用信息到達為止。編譯完成,提示我們已經在下了。 面向服務 面向服務的基礎 面向服務的三層:應用層,服務層,數(shù)據(jù)層 * 應用層:用于給用戶展示,PC,H5,IOS,安卓。 * 服務層:業(yè)務邏輯,提供接口(商品,訂單,支付,用戶,物流)。 * 數(shù)據(jù)層:提供數(shù)據(jù)支持(...

    songze 評論0 收藏0

發(fā)表評論

0條評論

B0B0

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<