php7 yar扩展,php扩展之Yar使用
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使用相关推荐
- php7.1解压包安装,【Swoole】php7.1安装swoole扩展
参照:https://zixuephp.net/article-430.html 1.源码编译安装,PHP版本7.1.33 2.在已经编译好安装的php7.1中安装swoole扩展. 一.下载swoo ...
- PHP7.1安装yaf扩展
PHP71安装yaf扩展 把PHP命令加到系统 下载Yaf扩展包 安装 PHP7.1安装yaf扩展 把PHP命令加到系统 我的PHP安装目录是/usr/local/webserver/php,所以ph ...
- php 7.1 openssl安装,介绍 php7.1 安装openssl扩展,php openssl
介绍 php7.1 安装openssl扩展介绍php7.1安装心脏出血扩展,PHP7栏目介绍php7.1 安装openssl扩展的方法 推荐(免费):PHP7 在安装(同脉冲亮度分析仪)脉冲振幅分析器 ...
- centos php支持yaf,CentOS环境下给PHP7.0安装yaf扩展
| CentOS环境下给PHP7.0安装yaf扩展 在CentOS环境下给PHP7.0安装yaf扩展,首先要知道PHP的安装目录在哪里,以我当前的路径为例,在/usr/local/php目录下. 下一 ...
- php 连接主从redis,PHP7对Redis的扩展及Redis主从搭建
在学习一下php7下面的安装及redis相关配置认识,并将笔记记下来,以备后用.主要涉及到redis的扩展php-redis 及redis主从的配置. 一:redis安装 1:下载并安装 cd /ho ...
- php7.2 安装phpredis扩展,以及phpredis操作redis命令列表
phpredis是redis的php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系;以下是redis官方提供的命令使用技巧: 下载安装地址如下: PHP7.2 安装Redis扩展 ...
- php7 libevent扩展,php7下安装event扩展方法
有效安排I/O,时间和信号的扩展 使用可用于特定平台的最佳I/O通知机制的事件,是PHP基础设施的libevent端口. 下载地址:http://pecl.php.net/package/event ...
- [RCTF 2019]Nextphp(php7.4的FFI扩展安全问题)
题目 打开题目,一段简单的php代码: <?php if (isset($_GET['a'])) {eval($_GET['a']); } else {show_source(__FILE__) ...
- php7 加密扩展,一个PHP7 代码的加密扩展,
一个PHP7 代码的加密扩展是PHP7代码的加密扩展, PHP7栏目介绍如何加密扩展 推荐:PHP7 介绍 一个简洁高效的跨 特点 简单快速,实际测量后几乎不影响性能.它与其他扩展兼容,如OPcach ...
- PHP7 windows增加自定义扩展和编译PHP源代码
PHP7 windows增加自定义扩展和编译PHP源代码 需要用到的材料 ①确定需要编译的版本,查看PHPINFO,确定PHP版本,VC版本和PHP位数.根据PHP VC版本下载对应的Visual S ...
最新文章
- CentOS 6.5环境实现corosync+pacemaker实现DRBD高可用
- ROUTEROS基本命令
- 《统一沟通-微软-实战》-6-部署-2-中介服务器-1-定义中介服务器
- Crystal Office Maple中文版
- java 反射field_java – 使用反射获取Field的泛型类型
- 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...
- 垃圾代码还能出圈?手把手教你写垃圾代码,从入门到精通!
- oracle扩容日志文件,调整Oracle Redo Logfile日志文件的大小
- jade软件_TEM衍射斑点标定之DM软件
- c#如何嵌套第三方程序_C#程序演示嵌套条件运算符的示例
- URL重写:RewriteCond指令与RewriteRule 指令格式
- Django项目调用外部程序soffice报错subprocess.CalledProcessError: Command 'soffice --headless --convert-to pdf
- 浅谈java.awt使用过程中遇到的问题
- su: /bin/bash: Permission denied带来的疑惑
- UVA10921 Find the Telephone【编码】
- Python_提取图片像素值
- 磁碟机病毒(Dummycom)专杀工具
- sw转cad映射文件_SolidWorks工程图转CAD图纸DWG文件教程-很吊
- 《特征工程入门与实践》读书笔记一
- 今天你18岁,父母的碎碎念