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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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