前言:
RPC,就是Remote Procedure Call的简称呀,翻译成中文就是远程过程调用
RPC要解决的两个问题:
- 解决分布式系统中,服务之间的调用问题。
- 远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑
如果模仿B/S架构的调用方式,每次调用时,都需要写一串发起http请求的代码。比如new Curl()...之类的,能不能像本地调用一样,去发起远程调用,让使用者感知不到远程调用的过程。
实际情况下,RPC很少用到http协议来进行数据传输,毕竟我只是想传输一下数据而已,何必动用到一个文本传输的应用层协议。 为什么不直接使用二进制传输。
安装:
$ pecl install yar
$ pecl install msgpack
服务端代码:
<?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 = ‘短信内容‘) { 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 // 一、直接调用 //$client = new Yar_Client("http://192.168.2.138/api/"); //$client->SetOpt(YAR_OPT_CONNECT_TIMEOUT, 1000); //$result = $client->sendSms(‘18234065200‘, ‘我是短信内容‘); //echo $result; // 二、并行调用 // public static call ( string $uri , string $method [, array $parameters [, callable $callback [, callable $error_callback [, array $options ]]]] ) // callback 回掉函数, 在远程服务的返回到达的时候被Yar调用, 从而可以处理返回内容 如果没有设置则调用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", [‘[email protected]‘], "callback", "callError", [YAR_OPT_TIMEOUT => 10]); // 发送请求 // public static loop ([ callable $callback [, callable $error_callback ]] ) Yar_Concurrent_Client::loop("loopCallback", "loopError"); function callback($retval, $callinfo) { echo ‘call自己的回调:‘ . $callinfo[‘method‘] . ‘方法返回数据‘ . $retval . PHP_EOL; } // 错误回掉函数, 如果设置了, Yar在发送出所有的请求之后立即调用一次这个回掉函数(此时还没有任何请求返回), 调用的时候$callinfo参数是NULL function loopCallback($retval, $callinfo) { if (is_null($callinfo)) { echo ‘所有rpc请求发送完毕调用‘ . PHP_EOL; } else { echo ‘调用成功后返回‘ . PHP_EOL; var_dump($retval); var_dump($callinfo); } } // 错误回调 function callError() { echo ‘发送rpc出错‘ . PHP_EOL; } // 错误回掉函数, 如果设置了, 那么Yar在出错的时候会调用这个回掉函数 function loopError() { echo ‘发送rpc出错‘ . PHP_EOL; }
参考:
https://github.com/laruence/yar
http://www.laruence.com/2012/09/15/2779.html
原文地址:https://www.cnblogs.com/cshaptx4869/p/12177701.html
时间: 2024-10-11 04:03:45