- yar的特點(diǎn)
- 運(yùn)行時(shí)配置
- server端
- client端
- 并行調(diào)用
- 持久調(diào)用
- 自定義主機(jī)名解析
- http代理
- github官方地址及鳥哥關(guān)于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