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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!