如格式有缺失請參考原文:
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