yar php使用,PHP yar的使用简介
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的使用简介相关推荐
- [Yar] yar安装与使用过程中遇到问题总结
yar安装与使用过程中遇到问题总结 Yar 简介 官方文档 yar安装 yar运行时的默认配置 yar常量 使用范例 遇到的问题 应用流程 Yar 简介 Yar 是一个轻量级, 高效的RPC框架, 它 ...
- yar java_Yar 的传输协议学习以及 Java 版本的实现
在 yar 中规定的传输协议如下图所示,请求体为82个字节的yar_header_t和8字节的打包名称和请求实体yar_request_t,在yar_header_t里面用body_len记录8字节的 ...
- java请求并行方案_让 Yar Java Client 支持执行并行请求,ExecutorService 的使用
官方 php 客户端文档如下Yar_Concurrent_Client { /* 属性 */ static $_callstack ; static $_callback ; static $_err ...
- php7.2+yar框架+nginx
yar全部可用版本见:https://pecl.php.net/package/yar 安装模块参照:https://blog.csdn.net/qq_44379042/article/details ...
- 使用 OSquery 和 YARA 进行审计
Part 1: osquery 简介 osquery是适用于 Windows.OSX.Linux 和 FreeBSD 的操作系统工具框架.这些工具使低级操作系统分析和监控既高效又直观. osq ...
- yara规则学习与使用
最近需要对分析的病毒提供一定的检测能力.看了一圈发现yara规则比较满足我的需求. 本文包括: yara规则的简单介绍 yara规则的编写(字符串定义和条件定义)(基本就是官网翻译了) 如何在pyth ...
- mac php安装mysql扩展_(MAC) PHP扩展安装
前言 每个人的安装环境不同,具体安装依个人而异! 1.安装之前先查看php.ini的位置,然后将扩展写入配置文件. php -i | grep php.ini # php --ini # Loaded ...
- yara规则--编写
编写 YARA 规则 - yara 4.2.0 文档 YARA规则易于编写和理解,并且它们的语法是 类似于 C 语言.这是您可以编写的最简单的规则 YARA,它什么都不做: rule dummy {c ...
- Levenshtein Transformer翻译
摘要 现有的神经序列生成模型,要么是从头开始逐步生成字符,要么(迭代地)修改以固定长度为边界的字符序列.在这项工作中,我们提出了Levenshtein Transformer,这是一种新的部分自回归模 ...
- Yar的RPC的应用-php
RPC,即 Remote Procedure Call(远程过程调用),调用远程计算机上的服务,就像调用本地服务一样.RPC可以很好的解耦系统.RPC 可基于 HTTP 或 TCP 协议,Web Se ...
最新文章
- CSS3 Box-shadow 阴影效果用法
- 深入理解 wpa_supplicant(一)
- +z +Z compiler flag for HP
- bat 快速切换路径
- Winform开发框架之插件化应用框架实现
- 航电 2041 超级楼梯
- 【Java虚拟机规范】JVM类加载机制
- 牛津大学计算机科学研究生几年,2020年牛津大学硕士一般几年毕业
- Android Notification状态栏通知
- Java程序员需要了解的两种服务器设计模型
- 【clickhouse】clickhouse : Suspiciously many broken parts to remove.: Cannot attach table default
- 怎么更好掌握Web前端技术?JS的跨域是怎么回事?
- 阿里“AI搭配师”一秒给你100种穿搭建议,程序员进军女性时尚靠什么?
- hadoop 文件上传
- MySQL如何删除一行数据
- 移动通信网中的密码算法演进之完整性保护
- leetcode21 合并两个有序链表
- 【论文相关】强化学习:提前看287篇ICLR-2021 深度强化学习领域论文得分汇总列表...
- 2018年最佳45 APM(应用程序性能监视和管理)工具
- 会考flash中文字变形为三角形_高中会考flash