Yar是什么

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

安装

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端示例:

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)串行:

$client = new Yar_Client("http://host/api/");

$result = $client->api("parameter);

?>

2)并行化调用

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

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

//串行调用

//$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的响应:

function callback($retval, $callinfo) {

if ($callinfo == NULL) {

//请求发送完毕,会运行到这里

//做本地的逻辑

return TRUE;

}

//RPC请求返回, callback会再次调用。返回值在$retval

}

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

/**

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

}

}

资料

范例

Example #1 Yar Server示例

/* 假设这个页面的访问路径是: 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请求)

以上例程的输出类似于:

Example #3 Yar Client示例

$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示例

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

yar php使用,PHP yar的使用简介相关推荐

  1. [Yar] yar安装与使用过程中遇到问题总结

    yar安装与使用过程中遇到问题总结 Yar 简介 官方文档 yar安装 yar运行时的默认配置 yar常量 使用范例 遇到的问题 应用流程 Yar 简介 Yar 是一个轻量级, 高效的RPC框架, 它 ...

  2. yar java_Yar 的传输协议学习以及 Java 版本的实现

    在 yar 中规定的传输协议如下图所示,请求体为82个字节的yar_header_t和8字节的打包名称和请求实体yar_request_t,在yar_header_t里面用body_len记录8字节的 ...

  3. java请求并行方案_让 Yar Java Client 支持执行并行请求,ExecutorService 的使用

    官方 php 客户端文档如下Yar_Concurrent_Client { /* 属性 */ static $_callstack ; static $_callback ; static $_err ...

  4. php7.2+yar框架+nginx

    yar全部可用版本见:https://pecl.php.net/package/yar 安装模块参照:https://blog.csdn.net/qq_44379042/article/details ...

  5. 使用 OSquery 和 YARA 进行审计

    Part 1: osquery 简介 osquery是适用于 Windows.OSX.Linux 和 FreeBSD 的操作系统工具框架.这些工具使低级操作系统分析和监控既高效又直观.     osq ...

  6. yara规则学习与使用

    最近需要对分析的病毒提供一定的检测能力.看了一圈发现yara规则比较满足我的需求. 本文包括: yara规则的简单介绍 yara规则的编写(字符串定义和条件定义)(基本就是官网翻译了) 如何在pyth ...

  7. mac php安装mysql扩展_(MAC) PHP扩展安装

    前言 每个人的安装环境不同,具体安装依个人而异! 1.安装之前先查看php.ini的位置,然后将扩展写入配置文件. php -i | grep php.ini # php --ini # Loaded ...

  8. yara规则--编写

    编写 YARA 规则 - yara 4.2.0 文档 YARA规则易于编写和理解,并且它们的语法是 类似于 C 语言.这是您可以编写的最简单的规则 YARA,它什么都不做: rule dummy {c ...

  9. Levenshtein Transformer翻译

    摘要 现有的神经序列生成模型,要么是从头开始逐步生成字符,要么(迭代地)修改以固定长度为边界的字符序列.在这项工作中,我们提出了Levenshtein Transformer,这是一种新的部分自回归模 ...

  10. Yar的RPC的应用-php

    RPC,即 Remote Procedure Call(远程过程调用),调用远程计算机上的服务,就像调用本地服务一样.RPC可以很好的解耦系统.RPC 可基于 HTTP 或 TCP 协议,Web Se ...

最新文章

  1. CSS3 Box-shadow 阴影效果用法
  2. 深入理解 wpa_supplicant(一)
  3. +z +Z compiler flag for HP
  4. bat 快速切换路径
  5. Winform开发框架之插件化应用框架实现
  6. 航电 2041 超级楼梯
  7. 【Java虚拟机规范】JVM类加载机制
  8. 牛津大学计算机科学研究生几年,2020年牛津大学硕士一般几年毕业
  9. Android Notification状态栏通知
  10. Java程序员需要了解的两种服务器设计模型
  11. 【clickhouse】clickhouse : Suspiciously many broken parts to remove.: Cannot attach table default
  12. 怎么更好掌握Web前端技术?JS的跨域是怎么回事?
  13. 阿里“AI搭配师”一秒给你100种穿搭建议,程序员进军女性时尚靠什么?
  14. hadoop 文件上传
  15. MySQL如何删除一行数据
  16. 移动通信网中的密码算法演进之完整性保护
  17. leetcode21 合并两个有序链表
  18. 【论文相关】强化学习:提前看287篇ICLR-2021 深度强化学习领域论文得分汇总列表...
  19. 2018年最佳45 APM(应用程序性能监视和管理)工具
  20. 会考flash中文字变形为三角形_高中会考flash

热门文章

  1. linux单网卡多拨Adsl,ADSL多拨
  2. 如何保存你的登录密码
  3. 电商搜索里都有啥?详解闲鱼搜索系统(长文)
  4. Python实现爬取腾讯招聘网岗位信息
  5. 19深度探秘搜索技术_基于slop参数实现近似匹配以及原理剖析和相关实验
  6. 熟悉RT-Thread的软硬件环境【RT-Thread学习笔记 1】
  7. putty使用SSH密钥登录Linux实例
  8. 在unity中,模型自动旋转
  9. 08:判断一个数能否同时被3和5整除
  10. bzoj 4987: Tree 树形dp