Yar+RPC 服务 面试
介绍
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC 不依赖于具体的网络传输协议,tcp、udp 等都可以。由于存在各式各样的变换和细节差异,相应的 rpc 也派生出了各式远程过程通信协议。RPC 是跨语言的通信标准,SUN 和微软都有其实现,比如RMI 可以被看作 SUN 对 RPC 的 Java 版本( 实现),而微软的 DCOM 就是建立在 ORPC 协议之上。一言以蔽之,RPC 是协议,而无论是 SUN 的 RMI 还是微软的 DCOM 都是对该协议的不同实现,二者都为编程人员提供了应用PRC技术的程序接口(API`)。
yar.timeout 处理超时,默认为 5000 (ms)
yar.connect_timeout 连接超时,默认为 1000 (ms)
yar.packager //设置 yar 的打包工具,默认是 “php“, 当以 --enable-msgpack 构建扩展,则默认值为 msgpack, 它的值可以为 “php“, “json“, “msgpack“
yar.debug 默认是 Off, 打开的时候, Yar 会把请求过程的日志都打印出来(到 stderr)
yar.expose_info 默认是 On, 如果关闭, 则当通过浏览器访问 Server 的时候, 不会出现 Server Info 信息
yar.content_type 默认是 “application/octet-stream“
yar.allow_persistent 默认是 Off
服务端代码
<?php
/ 假设这个页面的访问路径是: http://example.com/operator.php /
class Operator {
/**
* Add two operands
* @param interge
* @return interge
*/
public function add($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;
}
/**
* 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();
客户端调用代码
<?php
$client = new yar_client("http://example.com/operator.php");
/ call directly /
var_dump($client->add(1, 2));
/ call via call /
var_dump($client->call("add", array(3, 2)));
/ __add can not be called /
var_dump($client->_add(1, 2));
客户端异步调用代码
<?php
function callback($ret, $callinfo) {
echo $callinfo['method'] , " result: ", $ret , "\n";
}
/ 注册一个异步调用 /
Yar_Concurrent_Client::call("http://example.com/operator.php", "add", array(1, 2), "callback");
Yar_Concurrent_Client::call("http://example.com/operator.php", "sub", array(2, 1), "callback");
Yar_Concurrent_Client::call("http://example.com/operator.php", "mul", array(2, 2), "callback");
/ 发送所有注册的调用, 等待返回, 返回后Yar会调用callback回掉函数 /
Yar_Concurrent_Client::loop();
/ 重置call ,否则上面的call会调用/
Yar_Concurrent_Client::reset();
Yar_Concurrent_Client::call("http://example.com/operator.php", "sub", array(6, 7), "callback");
Yar_Concurrent_Client::loop();
本作品采用《CC 协议》,转载必须注明作者和本文链接