PHP函數(shù)參考33-一次清楚RPC框架Yar



如格式有缺失請(qǐng)參考原文:
PHP函數(shù)參考33-一次清楚RPC框架Yar - 9ong
PHP函數(shù)參考xx-其他基本擴(kuò)展 - 9ong

Yar 是一個(gè)輕量級(jí), 高效的RPC框架, 它提供了一種簡(jiǎn)單方法來讓PHP項(xiàng)目之間可以互相遠(yuǎn)程調(diào)用對(duì)方的本地方法. 并且Yar也提供了并行調(diào)用的能力. 可以支持同時(shí)調(diào)用多個(gè)遠(yuǎn)程服務(wù)的方法囤屹。

yar的特點(diǎn)

  • 快速,簡(jiǎn)單,簡(jiǎn)單

  • 支持并發(fā)RPC調(diào)用

  • 支持多種數(shù)據(jù)包(php, json, msgpack內(nèi)置)

  • 支持多種傳輸協(xié)議(http肢扯、https庆杜、TCP)

  • 詳細(xì)的調(diào)試信息

運(yùn)行時(shí)配置

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;
    }
    
    /**
    * 返回一個(gè)數(shù)組
    * @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();//啟動(dòng)服務(wù), 開始接受客戶端的調(diào)用請(qǐng)求. 來自客戶端的調(diào)用, 都是通過POST請(qǐng)求發(fā)送過來的  

假設(shè)server端腳本訪問路徑:http://demo.130.com/FunctionsReference/yar/yarServer.php
則訪問時(shí)會(huì)展示:

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

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

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

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

client端

    
//發(fā)起一個(gè)RPC調(diào)用, 并且得到返回值. 如果服務(wù)端的遠(yuǎn)程調(diào)用拋出異常, 那么本地也會(huì)相應(yīng)的拋出一個(gè)Yar_Server_Exception異常. 
$client = new yar_client("http://demo.130.com/FunctionsReference/yar/yarServer.php");

//設(shè)置調(diào)用遠(yuǎn)程服務(wù)的一些配置, 比如超時(shí)值, 打包類型等. 
//可以是: YAR_OPT_PACKAGER篮条、YAR_OPT_PERSISTENT (需要服務(wù)端支持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");//默認(rèn)php琐簇, "php", "json", "msgpack"兔跌,this server accept json packager
//設(shè)置header
$client->SetOpt(YAR_OPT_HEADER, array("hd1: val", "hd2: val"));  //Custom headers, Since 2.0.4

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

    /*遠(yuǎn)程調(diào)用方式2: call via __call */
    var_dump($client->__call("add", array(3, 2)));
    var_dump($client->returnArray());
    var_dump($client->add(0, 2));//遠(yuǎn)端服務(wù)端拋出異常
    
} 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以外的方法不能被調(diào)用,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不能為空."

并行調(diào)用

  • Yar_Concurrent_Client::call — 注冊(cè)一個(gè)并行的服務(wù)調(diào)用

  • Yar_Concurrent_Client::loop — 發(fā)送所有注冊(cè)的并行調(diào)用

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

    如果這個(gè)回掉函數(shù)被設(shè)置, 那么Yar在發(fā)送出所有的請(qǐng)求之后立即調(diào)用一次這個(gè)回掉函數(shù)(此時(shí)還沒有任何請(qǐng)求返回), 調(diào)用的時(shí)候$callinfo參數(shù)是NULL帝嗡。

    如果在注冊(cè)并行調(diào)用的時(shí)候制定了callback, 那么那個(gè)callback有更高的優(yōu)先級(jí)晶通。


function callback($retval, $callinfo)
{
    if ($callinfo == NULL) {
        echo "現(xiàn)在, 所有的請(qǐng)求都發(fā)出去了, 還沒有任何請(qǐng)求返回\n";
    } else {
        echo "這是一個(gè)遠(yuǎn)程調(diào)用的返回, 調(diào)用的服務(wù)名是", $callinfo["method"],
        ". 調(diào)用的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" .默認(rèn)php格式, json告訴服務(wù)端丈探,客戶端接收json格式數(shù)據(jù)
    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]);

    //發(fā)送所有的已經(jīng)通過 Yar_Concurrent_Client::call()注冊(cè)的并行調(diào)用, 并且等待返回. 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());
}    

持久調(diào)用

在Yar 2.1.0之后录择,如果YAR_OPT_PERSISTENT設(shè)置為true拔莱,那么Yar就可以使用HTTP keep-alive來加速對(duì)同一個(gè)地址的重復(fù)調(diào)用碗降,鏈接將在PHP請(qǐng)求生命周期結(jié)束時(shí)釋放。

$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 新功能介紹 - 風(fēng)雪之隅</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)是一個(gè)輕量級(jí)支持并行調(diào)用的PHP RPC框架塘秦,是我還在微博的時(shí)候?yàn)榱藘?yōu)化微博的性能而開發(fā)的一個(gè)工具讼渊,Yar的并行調(diào)用在微博被大量應(yīng)用以降低用戶請(qǐng)求耗時(shí)。 最近還是因?yàn)橐咔樽鹛蓿野裏af爪幻,Yaconf都優(yōu)化了一輪,今天也完成了Yar的優(yōu)化(事實(shí)上须误,Yar之前寫的就還不錯(cuò)挨稿,沒啥可優(yōu)化的,哈哈)京痢,也新增了倆個(gè)能力奶甘。我來簡(jiǎn)單介紹下:</font></div></div></div><br />

自定義主機(jī)名解析

在Yar 2.1.0之后,如果Yar運(yùn)行在HTTP協(xié)議上祭椰,則可以使用YAR_OPT_RESOLVE來定義自定義主機(jī)名解析臭家。

$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運(yùn)行在HTTP協(xié)議上,則可以使用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官方地址及鳥哥關(guān)于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 新功能介紹 - 風(fēng)雪之隅</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)是一個(gè)輕量級(jí)支持并行調(diào)用的PHP RPC框架,是我還在微博的時(shí)候?yàn)榱藘?yōu)化微博的性能而開發(fā)的一個(gè)工具你踩,Yar的并行調(diào)用在微博被大量應(yīng)用以降低用戶請(qǐng)求耗時(shí)诅岩。 最近還是因?yàn)橐咔椋野裏af带膜,Yaconf都優(yōu)化了一輪按厘,今天也完成了Yar的優(yōu)化(事實(shí)上,Yar之前寫的就還不錯(cuò)钱慢,沒啥可優(yōu)化的逮京,哈哈),也新增了倆個(gè)能力束莫。我來簡(jiǎn)單介紹下:</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) - 風(fēng)雪之隅</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打頭, 呵呵, 因?yàn)檫@樣名字好起)是我在3個(gè)多月前, 為了解決一個(gè)實(shí)際的問題, 而開發(fā)的一個(gè)PHP擴(kuò)展的, RPC框架, 和現(xiàn)有的RPC框架(xml-rpc, soap)不同, 這是一個(gè)輕量級(jí)的框架, 支持多種打包協(xié)議(msgpack, json, php), 并且最重要的一個(gè)特點(diǎn)是, 它是可并行化的..</font></div></div></div><br />


如格式有缺失請(qǐng)參考原文:
PHP函數(shù)參考33-一次清楚RPC框架Yar - 9ong
PHP函數(shù)參考xx-其他基本擴(kuò)展 - 9ong

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載懒棉,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末览绿,一起剝皮案震驚了整個(gè)濱河市策严,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饿敲,老刑警劉巖妻导,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異怀各,居然都是意外死亡倔韭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門瓢对,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寿酌,“玉大人,你說我怎么就攤上這事硕蛹〈继郏” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵法焰,是天一觀的道長(zhǎng)秧荆。 經(jīng)常有香客問我,道長(zhǎng)埃仪,這世上最難降的妖魔是什么乙濒? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮贵试,結(jié)果婚禮上琉兜,老公的妹妹穿的比我還像新娘凯正。我一直安慰自己,他們只是感情好豌蟋,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布廊散。 她就那樣靜靜地躺著,像睡著了一般梧疲。 火紅的嫁衣襯著肌膚如雪允睹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天幌氮,我揣著相機(jī)與錄音缭受,去河邊找鬼。 笑死该互,一個(gè)胖子當(dāng)著我的面吹牛米者,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宇智,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼蔓搞,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了随橘?” 一聲冷哼從身側(cè)響起喂分,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎机蔗,沒想到半個(gè)月后蒲祈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萝嘁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年梆掸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酿愧。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沥潭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嬉挡,到底是詐尸還是另有隱情,我是刑警寧澤汇恤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布庞钢,位于F島的核電站,受9級(jí)特大地震影響因谎,放射性物質(zhì)發(fā)生泄漏基括。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一财岔、第九天 我趴在偏房一處隱蔽的房頂上張望风皿。 院中可真熱鬧河爹,春花似錦、人聲如沸桐款。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽魔眨。三九已至媳维,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間遏暴,已是汗流浹背侄刽。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留朋凉,地道東北人州丹。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像杂彭,于是被迫代替她去往敵國(guó)和親当叭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容