Yar 是一个轻量级, 高效的RPC框架, 它提供了一种简单方法来让PHP项目之间可以互相远程调用对方的本地方法. 并且Yar也提供了并行调用的能力. 可以支持同时调用多个远程服务的方法.

有个业务场景,需要本地项目去调用一个服务层的相关方法实现相应的功能,一般情况,可以通过普通的http的方式进行请求即可,但是如果只是这个服务是内部使用,那么可以使用rpc的方式进行替代.好处自不必多说,基于tcp传输,支持并发结合在项目中使用。

首先介绍服务端:RpcServer.php

namespace appindexlogic;

/**

* rpc基类(服务端)

*/

class RpcServer

{

private static $signs = [

"sign1", //不同的来源Salt不同

"sign2",

];

// 验证签名

protected function checkSign($params,$sign)

{

if(empty($sign)){

return false;

}

ksort($params);

$signStr = "";

foreach($params as $key => $val)

{

if(empty($val) || $val == $sign) continue;

$signStr .= $key."=".$val."&";

}

$signStr = rtrim($signStr,"&");

foreach (self::$signs as $v){

if(md5($signStr.$v) === $sign){

return true;

}

}

}

// 处理结果

protected function response($status,$data)

{

$response = [

"status" => $status,

"message" => "", //状态码对应的信息(从配置文件中获取)

"data" => $data,

];

return $response;

}

}

服务端方法:

namespace appindexlogic;

class User extends RpcServer

{

// 用户扩展信息

public function userExt($ids)

{

// 1.验证签名

// 2.逻辑处理

// 3.结果返回

return $ids;

}

// 用户基础信息

public function userBase($ids)

{

return $ids;

}

}

客户端:RpcClient.php

namespace appindexlogic;

/**

* rpc基类(客户端)

*/

class RpcClient

{

private static $signs = [

"sign1", //不同来源

"sign2"

];

private $callBack;

private $callNum = 0;

/**

* 取得签名

* @param $params 接口调用时的参数

*/

protected function getSign($params,$type)

{

ksort($params);

$signStr = "";

foreach($params as $key => $val)

{

if(empty($val)) continue;

$signStr .= $key."=".$val."&";

}

$signStr = rtrim($signStr,"&");

return md5($signStr.self::$signs[$type]);

}

/**

* 调用服务端接口

* @param $server Api server

* @param $api 接口

* @param $params 参数

* @param $openSign 开启签名

* @param $callBack 回调

*/

public function call($server,$api,$params,$openSign=false,$callBack=null)

{

if($openSign){

$params["sign"] = $this->getSign($params);

}

if($callBack === null){

$client = new Yar_Client($server);

return call_user_func_array([$client,$api], $params);

}

$this->callNum ++;

$this->callBack = $callBack;

return Yar_Concurrent_Client::call($server,$api,$params,array($this, "ApiClientCallBack"));

}

/**

* 执行并发调用

*/

public function loop()

{

return Yar_Concurrent_Client::loop([$this,"callback1"],[$this,"error_callback"]);

}

/**

* 并发调用回调

* @param $retval

* @param $callinfo

*/

public function ApiClientCallBack($retval,$callinfo)

{

if($callinfo === null){

return $this->callBack($retval,$callinfo);

}

static $data = array();

$data[] = $retval; //并发

if(count($data) == $this->callNum){

$fn = $this->callBack;

return $this->$fn($data,$callinfo);

}

}

//

public function callback1($retval, $callinfo)

{

if ($callinfo == NULL) {

echo "现在, 所有的请求都发出去了, 还没有任何请求返回

";

} else {

echo "这是一个远程调用的返回, 调用的服务名是", $callinfo["method"],

". 调用的sequence是 " , $callinfo["sequence"] , "

";

var_dump($retval);

}

}

// 异常回调

public function error_callback($type, $error, $callinfo)

{

error_log(json_encode(func_get_args() ),3,"rpc.log" );

}

}

客户端调用:

namespace appindexlogic;

// 相关测试

class Test extends RpcClient

{

public function testRpc()

{

$api = "http://thinkphp.com/index/rpc/users";

// $this->call($api,"userExt",[1,2],false,"callback");

$this->call($api,"userBase",[3,4],false,"callback");

$this->call($api,"userBase",[5],false,"callback");

$this->loop();

return false;

// $client = new yar_client("http://thinkphp.com/index/rpc/user");

// $ret = $client->userInfo([1,2]);

// var_dump($ret);

}

// 回调数据

public function callback($data,$callinfo)

{

var_dump(func_get_args());die;

// static $a = [];

// $a[] = json_encode(func_get_args());

// print_r($a);

// error_log(json_encode(func_get_args() ),3,"rpc.log" );

}

}

即可实现简单的rpc调用

php7 yar扩展,php扩展之Yar使用相关推荐

  1. php7.1解压包安装,【Swoole】php7.1安装swoole扩展

    参照:https://zixuephp.net/article-430.html 1.源码编译安装,PHP版本7.1.33 2.在已经编译好安装的php7.1中安装swoole扩展. 一.下载swoo ...

  2. PHP7.1安装yaf扩展

    PHP71安装yaf扩展 把PHP命令加到系统 下载Yaf扩展包 安装 PHP7.1安装yaf扩展 把PHP命令加到系统 我的PHP安装目录是/usr/local/webserver/php,所以ph ...

  3. php 7.1 openssl安装,介绍 php7.1 安装openssl扩展,php openssl

    介绍 php7.1 安装openssl扩展介绍php7.1安装心脏出血扩展,PHP7栏目介绍php7.1 安装openssl扩展的方法 推荐(免费):PHP7 在安装(同脉冲亮度分析仪)脉冲振幅分析器 ...

  4. centos php支持yaf,CentOS环境下给PHP7.0安装yaf扩展

    | CentOS环境下给PHP7.0安装yaf扩展 在CentOS环境下给PHP7.0安装yaf扩展,首先要知道PHP的安装目录在哪里,以我当前的路径为例,在/usr/local/php目录下. 下一 ...

  5. php 连接主从redis,PHP7对Redis的扩展及Redis主从搭建

    在学习一下php7下面的安装及redis相关配置认识,并将笔记记下来,以备后用.主要涉及到redis的扩展php-redis 及redis主从的配置. 一:redis安装 1:下载并安装 cd /ho ...

  6. php7.2 安装phpredis扩展,以及phpredis操作redis命令列表

    phpredis是redis的php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系;以下是redis官方提供的命令使用技巧: 下载安装地址如下: PHP7.2 安装Redis扩展 ...

  7. php7 libevent扩展,php7下安装event扩展方法

    有效安排I/O,时间和信号的扩展 使用可用于特定平台的最佳I/O通知机制的事件,是PHP基础设施的libevent端口. 下载地址:http://pecl.php.net/package/event ...

  8. [RCTF 2019]Nextphp(php7.4的FFI扩展安全问题)

    题目 打开题目,一段简单的php代码: <?php if (isset($_GET['a'])) {eval($_GET['a']); } else {show_source(__FILE__) ...

  9. php7 加密扩展,一个PHP7 代码的加密扩展,

    一个PHP7 代码的加密扩展是PHP7代码的加密扩展, PHP7栏目介绍如何加密扩展 推荐:PHP7 介绍 一个简洁高效的跨 特点 简单快速,实际测量后几乎不影响性能.它与其他扩展兼容,如OPcach ...

  10. PHP7 windows增加自定义扩展和编译PHP源代码

    PHP7 windows增加自定义扩展和编译PHP源代码 需要用到的材料 ①确定需要编译的版本,查看PHPINFO,确定PHP版本,VC版本和PHP位数.根据PHP VC版本下载对应的Visual S ...

最新文章

  1. CentOS 6.5环境实现corosync+pacemaker实现DRBD高可用
  2. ROUTEROS基本命令
  3. 《统一沟通-微软-实战》-6-部署-2-中介服务器-1-定义中介服务器
  4. Crystal Office Maple中文版
  5. java 反射field_java – 使用反射获取Field的泛型类型
  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...
  7. 垃圾代码还能出圈?手把手教你写垃圾代码,从入门到精通!
  8. oracle扩容日志文件,调整Oracle Redo Logfile日志文件的大小
  9. jade软件_TEM衍射斑点标定之DM软件
  10. c#如何嵌套第三方程序_C#程序演示嵌套条件运算符的示例
  11. URL重写:RewriteCond指令与RewriteRule 指令格式
  12. Django项目调用外部程序soffice报错subprocess.CalledProcessError: Command 'soffice --headless --convert-to pdf
  13. 浅谈java.awt使用过程中遇到的问题
  14. su: /bin/bash: Permission denied带来的疑惑
  15. UVA10921 Find the Telephone【编码】
  16. Python_提取图片像素值
  17. 磁碟机病毒(Dummycom)专杀工具
  18. sw转cad映射文件_SolidWorks工程图转CAD图纸DWG文件教程-很吊
  19. 《特征工程入门与实践》读书笔记一
  20. 今天你18岁,父母的碎碎念

热门文章

  1. steam平台的Don‘t Starve Together 饥荒联机版管理后台
  2. Apple account使用不同账号续费问题
  3. 工业大数据的关键技术是什么
  4. 工业大数据竞赛的轴承数据集
  5. Appcms漏洞+webshell复习
  6. 关于mvn repository的one more step人机验证问题的解决
  7. 行人重识别——评价标准
  8. R语言ggplot2可视化格式化轴标签:用逗号格式化ggplot2轴标签、在轴标签数值中加入符号标签(货币符号)
  9. Seaborn(三)调色板palette
  10. 【CGAL_多面体】3D多面体表面