2019-03-16 11:09:13  223366 9

RPC框架yar的安装使用以及在tp5的使用

 标签:   

常见的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-au.jpg

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框架问题)

9 条留言

  1. 匿名用户

    cost of viagra does viagra raise blood pressure <a href=" https://pharm-usa-official.com/# #">generic viagra available </a> does sideafil work as good as viagra how long to wait after eating to take viagra,how long to wait after eating to take viagra viagra sex uncensored viagra pills 100 mg <a href=https://pharm-usa-official.com/#>cialis vs viagra </a> when is generic viagra available what helps viagra work better https://www.trainerjoel.com/2020/03/12/3-13-20-circuit-program/?unapproved=315&moderation-hash=2a1853a5866945e13933b2835c1ad7a1#comment-315 http://www.westgatespace.com/2014/12/new-restaurant-sids-cafe-opens-at-westgate-las-vegas-resort-casino/?unapproved=121951&moderation-hash=9e06a80a4c92a8e255d48fafd5be1bbd#comment-121951 https://reviewsofairpurifiers.com/levoit-core-300-air-purifier-review/?unapproved=157&moderation-hash=0fbc35e73e5c2893bf2049e3a31cd8c2#comment-157 https://tekkibytes.com/10-future-medical-technology-that-will-blow-your-mind/?unapproved=18894&moderation-hash=7fcd4a192c63efa7460e1f860474fe51#comment-18894 https://montreal.casino/online-casino-canada/?unapproved=27&moderation-hash=d80a8004f5404b36c72dcfd9901e7df5#comment-27

  2. 匿名用户

    viagra pills viagra 100mg <a href="https://girlife.info #">buy viagra </a> viagra pills generic viagra ufiouas0209sss generic viagra viagra generic <a href=http://amr-service.ru>buy viagra </a> viagra pills viagra online

给我留言

评论内容