PHP函數參考33-一次清楚RPC框架Yar



如格式有缺失請參考原文:
PHP函數參考33-一次清楚RPC框架Yar - 9ong
PHP函數參考xx-其他基本擴展 - 9ong

Yar 是一個輕量級, 高效的RPC框架, 它提供了一種簡單方法來讓PHP項目之間可以互相遠程調用對方的本地方法. 并且Yar也提供了并行調用的能力. 可以支持同時調用多個遠程服務的方法。

yar的特點

  • 快速,簡單,簡單

  • 支持并發RPC調用

  • 支持多種數據包(php, json, msgpack內置)

  • 支持多種傳輸協議(http、https、TCP)

  • 詳細的調試信息

運行時配置

yar.timeout //default 5000 (ms)
yar.connect_timeout //default 1000 (ms)
yar.packager //default "php", when built with --enable-msgpack then default "msgpack", it should be one of "php", "json", "msgpack"
yar.debug //default Off
yar.expose_info // default On, whether output the API info for GET requests
yar.content_type // default "application/octet-stream"
yar.allow_persistent // default Off

server端


class Operator {

    /**
    * Add two operands
    * @param interge 
    * @return interge
    */
    public function add($a, $b) {
        if(!$a || !$b){
            throw new Exception("server exception:a | b不能為空.");
        }
        return $this->_add($a, $b);
    }
    
    /**
    * Sub 
    */
    public function sub($a, $b) {
        return $a - $b;
    }

    /**
    * Mul
    */
    public function mul($a, $b) {
        return $a * $b;
    }
    
    /**
    * 返回一個數組
    * @return array
    */
    public function returnArray(){
        return ['a'=>"apple","b"=>'banana'];
    }


    /**
    * Protected methods will not be exposed
    * @param interge 
    * @return interge
    */
    protected function _add($a, $b) {
        return $a + $b;
    }
}

$server = new Yar_Server(new Operator());
$server->handle();//啟動服務, 開始接受客戶端的調用請求. 來自客戶端的調用, 都是通過POST請求發送過來的  

假設server端腳本訪問路徑:http://demo.130.com/FunctionsReference/yar/yarServer.php
則訪問時會展示:

-Operator::add($a, $b)
----------------------
/**
* Add two operands
* @param interge
* @return interge
*/

-Operator::sub($a, $b)
----------------------
/**
* Sub
*/

-Operator::mul($a, $b)
----------------------
/**
* Mul
*/

----------------------
-Operator::returnArray()
/**
* 返回一個數組
* @return array
*/    

client端

    
//發起一個RPC調用, 并且得到返回值. 如果服務端的遠程調用拋出異常, 那么本地也會相應的拋出一個Yar_Server_Exception異常. 
$client = new yar_client("http://demo.130.com/FunctionsReference/yar/yarServer.php");

//設置調用遠程服務的一些配置, 比如超時值, 打包類型等. 
//可以是: YAR_OPT_PACKAGER、YAR_OPT_PERSISTENT (需要服務端支持keepalive)、YAR_OPT_TIMEOUT、YAR_OPT_CONNECT_TIMEOUT 
//Set timeout to 1s
$client->SetOpt(YAR_OPT_CONNECT_TIMEOUT, 1000);
//Set packager to JSON
//$client->SetOpt(YAR_OPT_PACKAGER, "json");//默認php, "php", "json", "msgpack",this server accept json packager
//設置header
$client->SetOpt(YAR_OPT_HEADER, array("hd1: val", "hd2: val"));  //Custom headers, Since 2.0.4

try{
    /*遠程調用方式1: call directly */
    var_dump($client->add(1, 2));

    /*遠程調用方式2: call via __call */
    var_dump($client->__call("add", array(3, 2)));
    var_dump($client->returnArray());
    var_dump($client->add(0, 2));//遠端服務端拋出異常
    
} catch (Yar_Server_Exception $sex) {
    //Yar_Server_Exceptioin可以捕獲server端throw new exception異常
    var_dump($sex->getMessage());
}catch(Yar_Client_Exception $cex){
    //處理Yar_Client_Exception
    var_dump($cex->getMessage());
}


/* public以外的方法不能被調用,so __add can not be called */
//var_dump($client->_add(1, 2));

輸出:

int(3)
int(5)
array(2) {
["a"]=>
string(5) "apple"
["b"]=>
string(6) "banana"
}
string(37) "server exception:a | b不能為空."

并行調用

  • Yar_Concurrent_Client::call — 注冊一個并行的服務調用

  • Yar_Concurrent_Client::loop — 發送所有注冊的并行調用

    public static Yar_Concurrent_Client::loop([ callable $callback[, callable $error_callback]] ) : boolean
    

    如果這個回掉函數被設置, 那么Yar在發送出所有的請求之后立即調用一次這個回掉函數(此時還沒有任何請求返回), 調用的時候$callinfo參數是NULL。

    如果在注冊并行調用的時候制定了callback, 那么那個callback有更高的優先級。


function callback($retval, $callinfo)
{
    if ($callinfo == NULL) {
        echo "現在, 所有的請求都發出去了, 還沒有任何請求返回\n";
    } else {
        echo "這是一個遠程調用的返回, 調用的服務名是", $callinfo["method"],
        ". 調用的sequence是 ", $callinfo["sequence"], "\n";
        var_dump($retval);
    }
}

function loopCallback($retval, $callinfo){
    
}

function error_callback($type, $error, $callinfo)
{
    error_log($error);
}

$webserviceApi = "http://demo.130.com/FunctionsReference/yar/yarServer.php";

try{    
    Yar_Concurrent_Client::call($webserviceApi, "mul", [1,1], "callback");
    
    // if the callback is not specificed, callback in loop will be used
    Yar_Concurrent_Client::call($webserviceApi, "mul", [2,2]);   
    
    //it should be one of "php", "json", "msgpack" .默認php格式, json告訴服務端,客戶端接收json格式數據
    Yar_Concurrent_Client::call($webserviceApi, "addJson", [3,3], "callback", NULL, [YAR_OPT_PACKAGER => "json"]);
    
    //custom timeout 
    Yar_Concurrent_Client::call($webserviceApi, "mul", [4,4], "callback", NULL, [YAR_OPT_TIMEOUT => 1]);

    //發送所有的已經通過 Yar_Concurrent_Client::call()注冊的并行調用, 并且等待返回. the error_callback is optional
    Yar_Concurrent_Client::loop("callback", "error_callback"); 
} catch (Yar_Server_Exception $ex) {
    var_dump($ex->getMessage());
}catch(Yar_Client_Exception $ex){
    var_dump($ex->getMessage());
}    

持久調用

在Yar 2.1.0之后,如果YAR_OPT_PERSISTENT設置為true,那么Yar就可以使用HTTP keep-alive來加速對同一個地址的重復調用,鏈接將在PHP請求生命周期結束時釋放。

$client = new Yar_Client("http://host/api/");
$client->SetOpt(YAR_OPT_PERSISTENT, 1);

$result = $client->some_method("parameter");

/* The following calls will speed up due to keep-alive */
$result = $client->some_other_method1("parameter");
$result = $client->some_other_method2("parameter");
$result = $client->some_other_method3("parameter");

<div name="section_div" style="background-color:#f5f5dc;padding:5px 5px;width:100%;border-radius:5px;margin-top:15px;"><div><p><font size=3 style="color:black;"><a target="_blank" style="color:black;">Yar-2.1 新功能介紹 - 風雪之隅</a></font></p></div><div style="display:flex;display:-webkit-flex;"><div style="width:50px;"><img style="width:50px;" src="https://www.laruence.com/favicon.ico" /></div><div style="flex:1;-webkit-flex:1;padding-left:10px;overflow:hidden;"><font size=2 color=grey>Yar(Yet Another RPC framework)是一個輕量級支持并行調用的PHP RPC框架,是我還在微博的時候為了優化微博的性能而開發的一個工具,Yar的并行調用在微博被大量應用以降低用戶請求耗時。 最近還是因為疫情,我把Yaf,Yaconf都優化了一輪,今天也完成了Yar的優化(事實上,Yar之前寫的就還不錯,沒啥可優化的,哈哈),也新增了倆個能力。我來簡單介紹下:</font></div></div></div><br />

自定義主機名解析

在Yar 2.1.0之后,如果Yar運行在HTTP協議上,則可以使用YAR_OPT_RESOLVE來定義自定義主機名解析。

$client = new Yar_Client("http://host/api/");

$client->SetOpt(YAR_OPT_RESOLVE, "host:80:127.0.0.1");

/* call goes to 127.0.0.1 */
$result = $client->some_method("parameter");

http代理

在Yar 2.2.1之后,如果Yar運行在HTTP協議上,則可以使用YAR_OPT_PROXY來定義HTTP代理,例如fidder或charles。

$client = new Yar_Client("http://host/api/");

$client->SetOpt(YAR_OPT_PROXY,"127.0.0.1:8888"); //http proxy , Since 2.2.0

/* call goes to 127.0.0.1 */
$result = $client->some_method("parameter"); 

github官方地址及鳥哥關于yar的文章

<div name="section_div" style="background-color:#f5f5dc;padding:5px 5px;width:100%;border-radius:5px;margin-top:15px;"><div><p><font size=3 style="color:black;"><a target="_blank" style="color:black;">GitHub - laruence/yar: Light, concurrent RPC framework for PHP & C</a></font></p></div><div style="display:flex;display:-webkit-flex;"><div style="width:50px;"><img style="width:50px;" src="https://github.com/favicon.ico" /></div><div style="flex:1;-webkit-flex:1;padding-left:10px;overflow:hidden;"><font size=2 color=grey>Light, concurrent RPC framework for PHP & C. Contribute to laruence/yar development by creating an account on GitHub.</font></div></div></div><br />

<div name="section_div" style="background-color:#f5f5dc;padding:5px 5px;width:100%;border-radius:5px;margin-top:15px;"><div><p><font size=3 style="color:black;"><a target="_blank" style="color:black;">Yar-2.1 新功能介紹 - 風雪之隅</a></font></p></div><div style="display:flex;display:-webkit-flex;"><div style="width:50px;"><img style="width:50px;" src="https://www.laruence.com/favicon.ico" /></div><div style="flex:1;-webkit-flex:1;padding-left:10px;overflow:hidden;"><font size=2 color=grey>Yar(Yet Another RPC framework)是一個輕量級支持并行調用的PHP RPC框架,是我還在微博的時候為了優化微博的性能而開發的一個工具,Yar的并行調用在微博被大量應用以降低用戶請求耗時。 最近還是因為疫情,我把Yaf,Yaconf都優化了一輪,今天也完成了Yar的優化(事實上,Yar之前寫的就還不錯,沒啥可優化的,哈哈),也新增了倆個能力。我來簡單介紹下:</font></div></div></div><br />

<div name="section_div" style="background-color:#f5f5dc;padding:5px 5px;width:100%;border-radius:5px;margin-top:15px;"><div><p><font size=3 style="color:black;"><a target="_blank" style="color:black;">Yar - 并行的RPC框架(Concurrent RPC framework) - 風雪之隅</a></font></p></div><div style="display:flex;display:-webkit-flex;"><div style="width:50px;"><img style="width:50px;" src="https://www.laruence.com/favicon.ico" /></div><div style="flex:1;-webkit-flex:1;padding-left:10px;overflow:hidden;"><font size=2 color=grey>Yar(yet another RPC framework, 教主問我為啥都是Ya打頭, 呵呵, 因為這樣名字好起)是我在3個多月前, 為了解決一個實際的問題, 而開發的一個PHP擴展的, RPC框架, 和現有的RPC框架(xml-rpc, soap)不同, 這是一個輕量級的框架, 支持多種打包協議(msgpack, json, php), 并且最重要的一個特點是, 它是可并行化的..</font></div></div></div><br />


如格式有缺失請參考原文:
PHP函數參考33-一次清楚RPC框架Yar - 9ong
PHP函數參考xx-其他基本擴展 - 9ong

?著作權歸作者所有,轉載或內容合作請聯系作者
禁止轉載,如需轉載請通過簡信或評論聯系作者。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容