Yar框架详解

分类: 软件应用 > 其他

简介:

     Yar是一个轻量级,高校的RPC框架,它提供了一种简单方法来让PHP项目之间可以互相远程调用对方的本地方法,并且Yar也提供了并行调用的能力,可以支持同事调用多个远程服务的方法。

 

Yar_Server:

  1. 描述:

    1. 实例化Yar_server的时候,需要传递一个自定义API对象,将这个对象保留在属性_executor中,然后会将我们提交的参数作为这个对个对象的method来使用,相当于一个简单的路由功能,将doc注释作为api的接口说明来使用

    2. 如果不是post请求,则只输出接口说明

    3. 如果是post请求,接受api函数,读取post数据,检测API对象中是否存在此方法,如果存在就call_user_function_ex来执行此方法

  2. php类使用:

    1. Yar_Server::__construct — 创建一个HTTP RPC Server

    2. Yar_Server::handle — 启动HTTP RPC Server

Yar_client:

  1. 描述:

    1. 调用一个远程服务:实例化Yar_Client的时候,需要传递一个API的链接,并可以直接使用api中的方法

  2. PHP类:

    1. Yar_Client::__call --- 调用远程服务

    2. Yar_Client::__construct --- 创建一个客户端实例

    3. Yar_Client::setOpt --- 设置调用的配置

Yar_Concurrent_Client:

  1. 描述:

    1. 注册一个并行的服务调用,设置多个请求,所有的请求会一次发出, 只要有任何一个请求完成, 回调函数”callback”就会被立即调用。

  2. PHP类:

    1. Yar_Concurrent_Client::call --- 注册一个并行的服务调用

    2. Yar_Concurrent_Client::loop --- 发送所有注册的并行调用

  3. 实现:

    1. Yar_Concurrent_Client::call方法接收四个参数,

      1. 第一个是访问的接口地址,

      2. 第二个是需要执行的方法,

      3. 第三个是传递的参数,

      4. 第四个就是回调函数。

      5. 还有第五个参数,一个数组,它用来设置options,默认为空。

    2. 由Yar_Concurrent_Client::loop()统一发送 接收epoll事件,当发现有一个读事件时,读到所有数据然后调用callback。

 

实现代码:

client.php:

     <?php

     // 单个调用

     $client = new Yar_Client('http://tool.jgb.bzdev.net/yar/service.php');

     $result = $client->api('test');

     // 并行调用

     function callback($retval, $callinfo) {

         print_r($retval);

         print_r($callinfo);

     }

     Yar_Concurrent_Client::call("http://tool.jgb.bzdev.net/yar/service.php", "api", array("parameters"), "callback");

     Yar_Concurrent_Client::call("http://tool.jgb.bzdev.net/yar/service.php", "api", array("parameters"), "callback");

     Yar_Concurrent_Client::call("http://tool.jgb.bzdev.net/yar/service.php", "api", array("parameters"), "callback");

     Yar_Concurrent_Client::call("http://tool.jgb.bzdev.net/yar/service.php", "api", array("parameters"), "callback");

     Yar_Concurrent_Client::loop(); //send

service.php:

     <?php

     class service {

         /**

          * Yar测试

          * @params string 参数

          * @return string 返回内容

          */

         public function api($param) {

             return $param;

         }

         protected function client_can_not_see() { }

     }

     $service = new Yar_Server(new service());

     $service->handle();

来源:原创 发布时间:2021-12-04 21:35:43