常见的RPC框架
phprpc,yar, thrift, gRPC, swoole, hprose
下面重点讲一讲 yar 的安装使用 以及 在tp5中的使用
Yar介绍
Yar 是一个轻量级, 高效的RPC框架, 它提供了一种简单方法来让PHP项目之间可以互相远程调用对方的本地方法. 并且Yar也提供了并行调用的能力. 可以支持同时调用多个远程服务的方法.
支持多种打包协议(msgpack, json, php)
文档:
http://php.net/manual/zh/book.yar.php
作者 不用介绍了 肯定都知道 搞PHP的
yar是作为一个php扩展,所以需要编译,yar用msgpack的打包协议,所以要首先安装一下msgpack
msgpack 介绍 以及安装
MessagePack(以下简称MsgPack)一个基于二进制高效的对象序列化类库,可用于跨语言通信。它可以像JSON那样,在许多种语言之间交换结构对象;但是它比JSON更快速也更轻巧。支持Python、Ruby、Java、C/C++等众多语言。比Google Protocol Buffers还要快4倍。
MessagePack: It's like JSON. but fast and small.
官网:
https://msgpack.org/
安装msgpack
下载
msgpack http://pecl.php.net/get/msgpack-2.0.3.tgz
编译
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
引入
extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/msgpack.so
重启php
yar 安装
下载
http://pecl.php.net/get/yar-2.0.5.tgz
编译
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --enable-msgpack
make && make install
yar.so 配置到 php.in
extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/yar.so
yar简单使用 demo
server.php
<?php
class User{
public function getName(){
return 'hello yar';
}
}
$server =new Yar_Server(new User);
$server->handle();
client.php
<?php
$client = new Yar_Client('http://192.168.113.136/server.php');
echo $client->getName();
Yar_Server
一个属性 两个方法
Yar_Server {
protected $_executor ;
final public __construct ( Object $obj )
public handle ( void ) : boolean
}
__construct ( Object $obj )
创建一个Yar的HTTP RPC服务,参数 $obj 对象的所有公开方法都会被注册为服务函数, 可以被RPC调用。返回一个Yar_Server的实例。
handle ( void )
启动服务, 开始接受客户端的调用请求.
Yar_Client
Yar_Client {
/* 属性 */
protected $_protocol ;
protected $_uri ;
protected $_options ;
protected $_running ;
/* 方法 */
public __call ( string $method , array $parameters ) : void
final public __construct ( string $url )
public setOpt ( number $name , mixed $value ) : boolean
}
__construct ( string $url ) // 服务端的HTTP URL路径.
__call 魔术方法 第一个参数 是调用方法 第二个参数是 传递的参数
setOpt ( number $name , mixed $value )设置调用远程服务的一些配置, 比如超时值, 打包类型等
name
可以是: YAR_OPT_PACKAGER, YAR_OPT_PERSISTENT (需要服务端支持keepalive), YAR_OPT_TIMEOUT, YAR_OPT_CONNECT_TIMEOUT
Yar_Concurrent_Client
Yar_Concurrent_Client {
/* 属性 */
static $_callstack ;
static $_callback ;
static $_error_callback ;
/* 方法 */
public static call ( string $uri , string $method , array $parameters [, callable $callback ] ) : int
public static loop ([ callable $callback [, callable $error_callback ]] ) : boolean
public static reset ( void ) : bool
}
Yar_Concurrent_Client::call ( string $uri , string $method , array $parameters [, callable $callback ] )
注册一个并行的(异步的)远程服务调用, 不过这个调用请求不会被立即发出, 而是会在接下来调用 Yar_Concurrent_Client::loop()的时候才真正的发送出去.
uri
RPC 服务的 URI(http 或 tcp).
method
调用的服务名字(也就是服务方法名).
parameters 数组
调用的参数.
callback 可选 //不设置 可以在 loop设置
回调函数, 在远程服务的返回到达的时候被Yar调用, 从而可以处理返回内容.
function callback($retRes,$callifo){
}
第一个参数 是返回的数据 第二个参数是请求的信息
Yar_Concurrent_Client::loop ([ callable $callback [, callable $error_callback ]] )
发送所有的已经通过 Yar_Concurrent_Client::call()注册的并行调用, 并且等待返回.
所有请求发送成功调用一次callback 此时参数值为 null
发送成功后 获取结果 也会调用一次callback
Yar_Concurrent_Client::reset ( void )
在一个程序中分两次并发,在第二次的返回结果中会包含第一次并发请求的返回结果,使用此方法 清除第一次
清除所有注册的回调
Yar_Server_Exception 服务端异常
Yar_client_Exception 客户端异常
yar配置
yar.packager
设置Yar的打包工具, 可以是PHP(serialize), JSON, Msgpack(这个需要编译的时候指定--enable-msgpack).
yar.debug
打开的时候, Yar会把请求过程的日志都打印出来(到stderr).
yar.connect_timeout
连接超时(毫秒为单位)
yar.timeout
处理超时(毫秒为单位)
yar.expose_info
如果关闭, 则当通过浏览器访问Server的时候, 不会出现Server Info信息.
thinkphp使用yar
thinkphp5.0版本
Server.php
namespace app\index\controller;
use think\controller\Yar;
class Server extends Yar{
public function index(){
return 'hello yar';
}
public function test($age=null){ //传参数 要有默认值
return 'hello yar';
}
}
Client.php
namespace app\index\controller;
use think\controller\Yar;
class Client
{
public function index()
{
$client = new \Yar_Client('http://192.168.113.136:81/server');
$client->SetOpt(YAR_OPT_PACKAGER,'php'); //注意tp5只能用php msgpack以及json报错
echo $client->index();
}
}
thinphp5.1 框架已经移除自己添加
添加下面 代码 然后在引入即可
abstract class Yar
{
/**
* 构造函数
* @access public
*/
public function __construct()
{
//控制器初始化
if (method_exists($this, '_initialize')) {
$this->_initialize();
}
//判断扩展是否存在
if (!extension_loaded('yar')) {
throw new \Exception('not support yar');
}
//实例化Yar_Server
$server = new \Yar_Server($this);
// 启动server
$server->handle();
}
/**
* 魔术方法 有不存在的操作的时候执行
* @access public
* @param string $method 方法名
* @param array $args 参数
* @return mixed
*/
public function __call($method, $args)
{}
}
常见的几个问题
1 php版本一定要 7.0以上的
2 PHP Fatal error: Yar_Client::__call(): unsupported packager msgpack
这个问题 应该是编译 yar的时候 没有 加 --enable-msgpack
3 [msgpack] (php_msgpack_unserialize) Extra bytes in xxx
这个在 tp5使用 就是 tp5 打包协议 不能用msgpack 和 json 只能选择 php (这个问题暂时还没有解决,应该是tp5框架问题)
欢迎加入QQ技术交流群:604438441
本文章对应的****地址:https://ke.qq.com/course/385898?tuin=30289dc0