您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)如何進(jìn)行Yar并行的RPC框架使用分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
RPC,就是Remote Procedure Call的簡稱呀,翻譯成中文就是遠(yuǎn)程過程調(diào)用
RPC要解決的兩個問題:
解決分布式系統(tǒng)中,服務(wù)之間的調(diào)用問題。
遠(yuǎn)程調(diào)用時,要能夠像本地調(diào)用一樣方便,讓調(diào)用者感知不到遠(yuǎn)程調(diào)用的邏輯
如果模仿B/S架構(gòu)的調(diào)用方式,每次調(diào)用時,都需要寫一串發(fā)起http請求的代碼。比如new Curl()...之類的,能不能像本地調(diào)用一樣,去發(fā)起遠(yuǎn)程調(diào)用,讓使用者感知不到遠(yuǎn)程調(diào)用的過程。
實(shí)際情況下,RPC很少用到http協(xié)議來進(jìn)行數(shù)據(jù)傳輸,畢竟我只是想傳輸一下數(shù)據(jù)而已,何必動用到一個文本傳輸?shù)膽?yīng)用層協(xié)議。 為什么不直接使用二進(jìn)制傳輸。
$ pecl install yar $ pecl install msgpack
服務(wù)端代碼:
<?php require_once 'Email.php'; require_once 'Sms.php'; class Service { private $sms; private $email; public function __construct() { $this->sms = new Sms(); $this->email = new Email(); } /** * @param $mobile * @return string */ public function sendSms($mobile, $content = '短信內(nèi)容') { return $this->sms->send($mobile, $content); } /** * @param $email * @return string */ public function sendEmail($email) { return $this->email->send($email); } } $service = new Yar_Server(new Service()); $service->handle();
客戶端代碼:
<?php // 一、直接調(diào)用 //$client = new Yar_Client("http://192.168.2.138/api/"); //$client->SetOpt(YAR_OPT_CONNECT_TIMEOUT, 1000); //$result = $client->sendSms('18234065200', '我是短信內(nèi)容'); //echo $result; // 二、并行調(diào)用 // public static call ( string $uri , string $method [, array $parameters [, callable $callback [, callable $error_callback [, array $options ]]]] ) // callback 回掉函數(shù), 在遠(yuǎn)程服務(wù)的返回到達(dá)的時候被Yar調(diào)用, 從而可以處理返回內(nèi)容 如果沒有設(shè)置則調(diào)用loop中的callback // error_callback // $options Yar_Concurrent_Client::call("http://192.168.2.138/api/", "sendSms", ['18234065200', '歡迎注冊']); Yar_Concurrent_Client::call("http://192.168.2.138/api/", "sendEmail", ['12580@qq.com'], "callback", "callError", [YAR_OPT_TIMEOUT => 10]); // 發(fā)送請求 // public static loop ([ callable $callback [, callable $error_callback ]] ) Yar_Concurrent_Client::loop("loopCallback", "loopError"); function callback($retval, $callinfo) { echo 'call自己的回調(diào):' . $callinfo['method'] . '方法返回數(shù)據(jù)' . $retval . PHP_EOL; } // 錯誤回掉函數(shù), 如果設(shè)置了, Yar在發(fā)送出所有的請求之后立即調(diào)用一次這個回掉函數(shù)(此時還沒有任何請求返回), 調(diào)用的時候$callinfo參數(shù)是NULL function loopCallback($retval, $callinfo) { if (is_null($callinfo)) { echo '所有rpc請求發(fā)送完畢調(diào)用' . PHP_EOL; } else { echo '調(diào)用成功后返回' . PHP_EOL; var_dump($retval); var_dump($callinfo); } } // 錯誤回調(diào) function callError() { echo '發(fā)送rpc出錯' . PHP_EOL; } // 錯誤回掉函數(shù), 如果設(shè)置了, 那么Yar在出錯的時候會調(diào)用這個回掉函數(shù) function loopError() { echo '發(fā)送rpc出錯' . PHP_EOL; }
看完上述內(nèi)容,你們對如何進(jìn)行Yar并行的RPC框架使用分析有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。