2019-03-16 11:09:13  399330 33

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

33 条留言

  1. 匿名用户

    Medicament information for patients. Cautions. <a href="http://jelejewelry.ru">order cheap prednisone</a> Everything about medicines. Get here.

  2. 匿名用户

    <a href="https://albakh.ru">buy allegra cheap</a>

  3. 匿名用户

    <a href="https://credit-dlya-ip.online"> https://credit-dlya-ip.online</a>

  4. 匿名用户

    <a href="https://dota2.su">order cephalexin cheap</a>

  5. 匿名用户

    <a href="https://intermedia24.ru">where can i buy cheap cytotec online</a>

  6. 匿名用户

    <a href="https://lexapro2020.top/">lexapro 40 mg</a>

  7. 匿名用户

    Medicines information leaflet. Cautions. <a href="https://med-online-no-prescription.top/buy-prednisone-without-prescription/">buy prednisone</a> Everything information about pills. Read information here.

  8. 匿名用户

    Medicament information. Generic Name. <a href="https://doxycycline2020.top">order doxycycline pills</a> Best news about drugs. Get information now.

  9. 匿名用户

    <a href="https://coronav1rus.ru/">ковид</a>

  10. 匿名用户

    Pills information. Cautions. <a href="https://med-online-no-prescription.top/buy-lasix-without-prescription/">buy lasix</a> Everything what you want to know about medicines. Read information here.

  11. 匿名用户

    Medicament information sheet. Long-Term Effects. <a href=https://buyprozac247.top/>https://buyprozac247.top</a> Best information about pills. Read now.

  12. 匿名用户

    Meds prescribing information. Brand names. <a href=https://buyprozac247.top/>https://buyprozac247.top</a> Actual about medicine. Get information here.

  13. 匿名用户

    Medicines information. What side effects can this medication cause? <a href="http://mediapanorama-relax.ru/lisinopril/">lisinopril no prescription</a> Actual information about drugs. Get here.

  14. 匿名用户

    <a href="https://coronav1rus.ru/">коронавирус</a>

  15. 匿名用户

    Medicament information sheet. What side effects can this medication cause? <a href="https://doxycycline2020.top">where can i buy doxycycline tablets</a> Best information about medication. Get now.

  16. 匿名用户

    Medication information sheet. Short-Term Effects. <a href="https://med-online-no-prescription.top/buy-lamivudin-without-prescription/">buy lamivudin</a> Everything information about medicament. Get now.

  17. 匿名用户

    Drugs information leaflet. Cautions. <a href="https://trazodone.top">buy generic trazodone pill</a> All trends of pills. Get here.

  18. 匿名用户

    Medicament information leaflet. Drug Class. <a href="http://4-ever.ru/lisinopril/">lisinopril tablets</a> Some about medicine. Read now.

  19. 匿名用户

    <a href="https://all4skype.ru/sweater/">camis</a>

给我留言

评论内容