文档章节

PHP yar的使用简介

hansonwong
 hansonwong
发布于 2017/07/21 11:51
字数 1120
阅读 38
收藏 0

Yar是什么

Yar是并行的RPC框架(Concurrent RPC framework),Laruence开发。

安装

下载地址:http://pecl.php.net/package/yar

windows版本下载对应的扩展放到ext目录并更新php.ini:

[yar]
extension=php_yar.dll

Linux版本下载扩展的源码进行编译,将编译出来的so动态库放到extensions目录(例如/usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/)并更新php.ini:

[yar]
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20151012/yar.so

如何使用

Server端示例:

<?php
class API {
    /**
     * the doc info will be generated automatically into service info page.
     * @params
     * @return
     */
    public function api($parameter, $option = "foo") {
    }
 
    protected function client_can_not_see() {
    }
}
 
$service = new Yar_Server(new API());
$service->handle();
?>

Yar为了方便开发, 把文档和接口绑定到了一起, 对于上面的例子, 如果我们是简单的GET请求这个接口地址的话, 我们就会看到如下的信息页面:

Yar Server: API
+API::api($parameter, $option = 'foo')

Client端也很简单,有2种:
1)串行:

<?php
$client = new Yar_Client("http://host/api/");
$result = $client->api("parameter);
?>

2)并行化调用

<?php
function callback($retval, $callinfo) {
     var_dump($retval);
}
 
Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");
Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");
Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");
Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");
Yar_Concurrent_Client::loop(); //send
?>

这样, 所有的请求会一次发出, 只要有任何一个请求完成, 回调函数”callback”就会被立即调用.

这里还有一个细节, Yar见缝插针的不会浪费任何时间, 在这些请求发送完成以后, Yar会调用一次callback, 和普通的请求返回回调不同, 这次的调用的$callinfo参数为空.

示例

server端:yar.php

<?php

class API {
    /**
     * the doc info will be generated automatically into service info page.
     * @params
     * @return
     */
    public function test() {
        sleep(1);
        return 't';
        
    }
    
    public function test2() {
        sleep(3);
        return 'test2';
    }

}
 
$service = new Yar_Server(new API());
$service->handle();

直接在浏览器打开http://localhost/yar.php会显示API文档。

client端:yar_client.php

<?php

//串行调用
//$client = new Yar_Client("http://localhost/yar.php");
//$client->test();
//$client->test2();

function callback($retval, $callinfo) {
    //var_dump($retval);
    
    error_log(time().':callinfo:'.json_encode($callinfo).PHP_EOL, 3, 't.log');
    
    if ($callinfo == NULL) {
       //做本地的逻辑
       //return TRUE;
       error_log(time().':'.'send req success'.PHP_EOL, 3, 't.log');
    }else{
        error_log(time().':'.$retval.PHP_EOL, 3, 't.log');
    }
    
    
     
}

function callback2($retval, $callinfo) {
   
     
}

function error_callback($type, $error, $callinfo) {
    error_log($error);
}

//并行调用:
//1、所有请求发送成功,Yar会调用一次callback,其中$callinfo为null
//2、每个请求执行完成,获取到了结果,也会去调用callback,其中$callinfo不为null
$res = Yar_Concurrent_Client::call("http://localhost/yar.php", "test");
$res1 = Yar_Concurrent_Client::call("http://localhost/yar.php", "test2");
$res2 = Yar_Concurrent_Client::loop("callback", "error_callback");  //send

t.log:

1472832899:callinfo:null
1472832899:send req success
1472832900:callinfo:{"sequence":1,"uri":"http:\/\/localhost\/yar.php","method":"test"}
1472832900:t
1472832902:callinfo:{"sequence":2,"uri":"http:\/\/localhost\/yar.php","method":"test2"}
1472832902:test2

log验证了yar的执行过程。那么,实际应用中,我们就可以先发送请求, 请求发送完毕,然后得到第一次回调($callinfo为null), 继续做我们当前进程的工作; 等所有工作结束以后, 再交给Yar去获取并行RPC的响应:

<?php
function callback($retval, $callinfo) {
    if ($callinfo == NULL) {
        //请求发送完毕,会运行到这里
        //做本地的逻辑
       return TRUE;
    }
 
     //RPC请求返回, callback会再次调用。返回值在$retval
}

实际项目里,Server端里为避免每次实例化当前类,可以写个父类:

<?php

/**
 *Yar控制器类
 */
class YarAction{

    /**
     * 架构函数
     * @access public
     */
    public function __construct() {

        //判断扩展是否存在
        if(!extension_loaded('yar'))
            die('yar not support');
        //实例化Yar_Server
        $server     =   new Yar_Server($this);
        // 启动server
        $server->handle();
    }
}

资料

1、文档: http://www.laruence.com/2012/09/15/2779.html
2、扩展下载: http://pecl.php.net/package/yar/
3、github: https://github.com/laruence/yar

范例

Example #1 Yar Server示例

<?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();
?>

Example #2 通过浏览器访问(GET请求)

以上例程的输出类似于:

Yar Server Info

Example #3 Yar Client示例

<?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));
?>

以上例程的输出类似于:

int(3)
int(5)
PHP Fatal error:  Uncaught exception 'Yar_Server_Exception' with message 'call to api Operator::_add() failed' in *

Example #4 Yar Concurrent Client示例

<?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();
?>

以上例程的输出类似于:

mul result: 4
sub result: 1
add result: 3

本文转载自:

共有 人打赏支持
hansonwong
粉丝 0
博文 32
码字总数 2227
作品 0
广州
RPC框架--Yar-Client-for-Java

Yar是由PHP大神鸟哥创建的一个PHP并行高性能RPC框架。Yar可以跨平台使用,不过鸟哥没有提供Java的客户端。这次项目中正好需要Java来调用PHP的RPC服务,于是就诞生了Yar Client for Java。 使...

烫烫烫烫烫烫
2015/07/31
724
0
Len/Len Framwork

Len Framwork 简介: 这是个php框架, 但是这个框架还很弱小. Len 框架就像它的名字一样, 非常精简. 目标: 简单! 易用! 不给别人使用! 说明: 集成Composer组件; 集成Redis, Mongodb, Mysql, Ya...

Len
04/13
0
0
B站直播:使用Golang重构,流量最大的推送功能

1 悲剧直播推送功能 ****** 1.1 B站直播推送功能的困境 ***B站直播有个推送功能,就是这里,看到那个红色的数字没有,显示你关注的主播开播人数。 然后每个进入B站的用户,不管是不是直播的观...

anoty
2016/10/22
0
1
测试Yar实例报错,求解决

@雪候鸟 Yar1.2.1+PHP Version 5.4.16 yar-server.php handle();?> yar-client.php

小小程序员
2013/12/09
1K
3
Yar-1.0.0 发布,并行 RPC 框架

Yar-1.0.0发布 目前文档暂缺。http://pecl.php.net/package/yar Yar 是一个支持多种打包协议的, 并行的RPC框架. 它基于HTTP协议, 在libcurl基础上开发而成 简单的Server: class API { /** *...

王昊然
2012/10/12
2.4K
5

没有更多内容

加载失败,请刷新页面

加载更多

下一页

iOS开发用到的图片尺寸汇总

启动图 型号 竖屏 横屏 iPhone SE 640px × 1136px 1136px × 640px iPhone 6s 750px × 1334px 1334px × 750px iPhone 6s Plus 1242px × 2208px 2208px × 1242px iPhone 7 750px × 1334......

业界小白
25分钟前
0
0
浅谈redis

redis是一个开源,内存式的健值存储数据库,也被称为健值存储的字典服务器。健值类型有字符串,hash(哈希类型),set(集合),list(列表) 和有序集合 特征细节: 内存式:redis将健值存储在主...

拐美人
32分钟前
0
0
无限扩容,按需使用!ZStack推出基于阿里云NAS的文件存储服务

日前,ZStack发布2.6.0版本,正式宣布推出基于阿里云NAS的文件存储服务。得益于业界领先的阿里云分布式存储架构,融合NAS后的ZStack 2.6.0拥有高性能、高可靠、容量无限扩展、一键操作、按需...

ZStack社区版
34分钟前
1
0
崛起于Springboot2.X之Mongodb多数据源处理(35)

多数据源:4个mongodb库! 目录结构图: 1、添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId>......

木九天
40分钟前
0
0
如何获取显示器的EDID信息

Q1: 为什么要写这篇文章? A1:在最近的工作中遇到了不少问题,其中很多都是和EDID相关的。可以说,作为一家以“显示”为生的企业,我们时时刻刻在与EDID打交道。EDID这东西很简单,但是如果...

DB_Terrill
40分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部