Yar是什么

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

安装

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

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

  1. [yar]
  2. extension=php_yar.dll

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

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

如何使用

Server端示例:

  1. <?php
  2. class API {
  3. /**
  4. * the doc info will be generated automatically into service info page.
  5. * @params
  6. * @return
  7. */
  8. public function api($parameter, $option = "foo") {
  9. }
  10. protected function client_can_not_see() {
  11. }
  12. }
  13. $service = new Yar_Server(new API());
  14. $service->handle();
  15. ?>

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

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

Client端也很简单,有2种:

1)串行:

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

2)并行化调用

  1. <?php
  2. function callback($retval, $callinfo) {
  3. var_dump($retval);
  4. }
  5. Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");
  6. Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");
  7. Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");
  8. Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");
  9. Yar_Concurrent_Client::loop(); //send
  10. ?>

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

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

示例

server端:yar.php

  1. <?php
  2. class API {
  3. /**
  4. * the doc info will be generated automatically into service info page.
  5. * @params
  6. * @return
  7. */
  8. public function test() {
  9. sleep(1);
  10. return 't';
  11. }
  12. public function test2() {
  13. sleep(3);
  14. return 'test2';
  15. }
  16. }
  17. $service = new Yar_Server(new API());
  18. $service->handle();

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

client端:yar_client.php

  1. <?php
  2. //串行调用
  3. //$client = new Yar_Client("http://localhost/yar.php");
  4. //$client->test();
  5. //$client->test2();
  6. function callback($retval, $callinfo) {
  7. //var_dump($retval);
  8. error_log(time().':callinfo:'.json_encode($callinfo).PHP_EOL, 3, 't.log');
  9. if ($callinfo == NULL) {
  10. //做本地的逻辑
  11. //return TRUE;
  12. error_log(time().':'.'send req success'.PHP_EOL, 3, 't.log');
  13. }else{
  14. error_log(time().':'.$retval.PHP_EOL, 3, 't.log');
  15. }
  16. }
  17. function callback2($retval, $callinfo) {
  18. }
  19. function error_callback($type, $error, $callinfo) {
  20. error_log($error);
  21. }
  22. //并行调用:
  23. //1、所有请求发送成功,Yar会调用一次callback,其中$callinfo为null
  24. //2、每个请求执行完成,获取到了结果,也会去调用callback,其中$callinfo不为null
  25. $res = Yar_Concurrent_Client::call("http://localhost/yar.php", "test");
  26. $res1 = Yar_Concurrent_Client::call("http://localhost/yar.php", "test2");
  27. $res2 = Yar_Concurrent_Client::loop("callback", "error_callback"); //send

t.log:

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

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

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

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

  1. <?php
  2. /**
  3. *Yar控制器类
  4. */
  5. class YarAction{
  6. /**
  7. * 架构函数
  8. * @access public
  9. */
  10. public function __construct() {
  11. //判断扩展是否存在
  12. if(!extension_loaded('yar'))
  13. die('yar not support');
  14. //实例化Yar_Server
  15. $server = new Yar_Server($this);
  16. // 启动server
  17. $server->handle();
  18. }
  19. }

资料

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. C#改善程序的50种方法

    作者: suyan010203  来源: 博客园  发布时间: 2011-07-09 14:47  阅读: 11976 次  推荐: 8   原文链接   [收藏] 从去年找工作以来,都没什么时间写博 ...

  2. [资料分享]ACCESS2013 零基础到精通

    Microsoft Office Access是由微软发布的关系数据库管理系统.它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点,是 Microsoft O ...

  3. 我的前端故事----优美的编辑器GitHub Atom

    很多前端的同学都在用sublime text,我之前也在使用,但是后来接触到了Atom,就被它的高颜值深深的吸引了~~不愧是GitHub的工程师哦~审美就是高  Atom 作为一个跨平台的编辑软件,安 ...

  4. ubuntu install eclipse-installer

    1. sudo mkdir /usr/eclipseInstaller 2. tar -zxvf eclipse-inst-linux64.tar.gz -C /usr/eclipseInstalle ...

  5. 最常见的 20 个 jQuery 面试问题及答案

    jQuery 面试问题和答案 JavaScript 是客户端脚本的标准语言,而 jQuery 使得编写 JavaScript 更加简单.你可以只用写几行的jQuery 代码就能实现更多的东西. 它是最 ...

  6. 基于注解的Spring AOP入门、增强Advice实例

    这篇文章简单通过一个例子,介绍几种增强的基本配置,以方便spring框架初学者对aop的代码结构有个清楚的了解认识.首先,spring支持aop编程,支持aspectJ的语法格式来表示切入点,切面,增 ...

  7. grunt 单独压缩多个js和css文件【转】

    原文地址:http://xiaomiya.iteye.com/blog/2177877 使用grunt来压缩前端js,css文件 因为最近做的客户端本地项目有用到十几个js,js提交之前都需要压缩.用 ...

  8. JS中常遇到的浏览器兼容问题和解决方法

    今天整理了一下浏览器对JS的兼容问题,希望能给你们带来帮助,我没想到的地方请留言给我,我再加上: 常遇到的关于浏览器的宽高问题: //以下均可console.log()实验 var winW=docu ...

  9. maven内部运行原理解析

    maven至今还是Java编程语言构建的事实标准,大部分项目还在使用maven来进行构建,因此了解maven内部运行的原理对定位和分析问题还是很有裨益的.本篇文章主要介绍一些maven内部运行过程中的 ...

  10. 关于Delphi错误:Cannot make a visible window modal

    Delphi的fsMDIChild类型的窗体是不能使用ShowModal的,否则会弹出"Cannot make a visible window modal"异常, 但是把fsMD ...