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

参考:

yar粗略使用记录 - 轩脉刃 - 博客园

http://www.cnblogs.com/yjf512/p/3448474.html

yar框架使用笔记的更多相关文章

  1. 框架Hibernate笔记系列 基础Session

    标题:框架Hibernate笔记 资料地址: 1. www.icoolxue.com 孔浩 1.背景简介 Hibenate是JBoss公司的产品.它是数据持久化的框架.Usually,我们使用JDBC ...

  2. phalcon(费尔康)框架学习笔记

    phalcon(费尔康)框架学习笔记 http://www.qixing318.com/article/phalcon-framework-to-study-notes.html 目录结构   pha ...

  3. Yii框架学习笔记(二)将html前端模板整合到框架中

    选择Yii 2.0版本框架的7个理由 http://blog.chedushi.com/archives/8988 刚接触Yii谈一下对Yii框架的看法和感受 http://bbs.csdn.net/ ...

  4. Web框架——Django笔记

    Web框架--Django笔记 MVC和MTV MVC:Model.View.Controller MTV:Model.Template.View Django--MTV 1.创建Django程序   ...

  5. JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

    前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...

  6. JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

    前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...

  7. JavaSE中Map框架学习笔记

    前言:最近几天都在生病,退烧之后身体虚弱.头疼.在床上躺了几天,什么事情都干不了.接下来这段时间,要好好加快进度才好. 前面用了三篇文章的篇幅学习了Collection框架的相关内容,而Map框架相对 ...

  8. JavaSE中线程与并行API框架学习笔记1——线程是什么?

    前言:虽然工作了三年,但是几乎没有使用到多线程之类的内容.这其实是工作与学习的矛盾.我们在公司上班,很多时候都只是在处理业务代码,很少接触底层技术. 可是你不可能一辈子都写业务代码,而且跳槽之后新单位 ...

  9. JavaSE中线程与并行API框架学习笔记——线程为什么会不安全?

    前言:休整一个多月之后,终于开始投简历了.这段时间休息了一阵子,又病了几天,真正用来复习准备的时间其实并不多.说实话,心里不是非常有底气. 这可能是学生时代遗留的思维惯性--总想着做好万全准备才去做事 ...

随机推荐

  1. 查看Linux系统版本与位数

    查看系统发行版信息 查看LSB (Linux Standard Base)本身的版本信息. .el5   .el5 .el5 -bit LSB executable, Intel 80386, ver ...

  2. Daily Scrum Meeting ——FirstDay(Beta)12.09

    一.Daily Scrum Meeting照片 活动室被借走的我们只能站在宿舍门口一会儿会,还遇到了翁导查寝,被我们的架势吓了一跳不知道我们要干嘛.....

  3. 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析

    20145223<信息安全系统设计基础> GDB调试汇编堆栈过程分析 分析的c语言源码 生成汇编代码--命令:gcc -g example.c -o example -m32 进入gdb调 ...

  4. Python学习日志(二)

    在网易云课堂看到小甲鱼的python视频,想起以前看就是看他的视频学C的虽然后来不了了之都怪我自己啦,于是决定跟着这个视频来学python啦! IDLE IDLE其实是一个python shell , ...

  5. Linux 利用lsof命令恢复删除的文件

    lsof命令 lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP.UDP).找回/恢复删除的文件.是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需 ...

  6. 【EntityFramework Core】实体实例化注入

    由于逻辑需要,我希望能在EF Core实例化实体时,拿到实体并执行相关代码,所以我就研究了一番EF Core,得到以下方法. 1.创建实体初始化类,继承EntityMaterializerSource ...

  7. iOS 10 新特性 大汇总 及iOS 10 的一些小问题和 xcode 8 的新版本小问题

    iOS 10正式版是很值得升级的,特别是那些不打算购买iPhone 7的老用户,毕竟新系统在体验.流畅性上都做了一些升级. 1.开放电话接口 支持垃圾电话提醒 对于使用iPhone的国人来说,这个功能 ...

  8. 谷歌浏览器如何查看或获取Cookie字符串

    注:此博客仅供非web开发人员查看,以下内容都基于谷歌浏览器. 在网页空白处点击鼠标右键,在弹出菜单中选择[审查元素],可以看到网页下方出现审查元素相关界面. 在审查元素相关界面,点击[Network ...

  9. spring3.0使用annotation完全代替XML(续)

    从回帖的反应来看,大多数人还是不赞成完全代替XML的,这点倒是在意料之中.我个人还是倾向于用代码来取代XML的Bean定义,当然这更多的是关乎个人偏好,不代表与我观点不同的人就是错的. 先来说说代码相 ...

  10. 用Node.js发送邮件

    本文讲的是用Node.js通过一个开启smtp的已有的邮箱账号发送邮件,而不是如何创建一个邮件服务器 开启smtp服务 首先要去要使用的邮箱中设置开启smtp,才能正常发送邮件 这边以163邮箱为例 ...