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

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

  实例参考:http://hk2.php.net/manual/zh/yar.examples.php

  结合在项目中使用:

    首先介绍服务端:RpcServer.php

<?php
namespace app\index\logic;
/**
* 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;
}
}

  服务端方法:

    

<?php
namespace app\index\logic; class User extends RpcServer
{ // 用户扩展信息
public function userExt($ids)
{
// 1.验证签名
// 2.逻辑处理
// 3.结果返回
return $ids;
} // 用户基础信息
public function userBase($ids)
{
return $ids;
} }

  客户端:RpcClient.php

<?php
namespace app\index\logic; /**
* rpc基类(客户端)
*/
class RpcClient
{ private static $signs = [
'sign1', //不同来源
'sign2'
]; private $callBack;
private $callNum = ; /**
* 取得签名
* @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 "现在, 所有的请求都发出去了, 还没有任何请求返回\n";
} else {
echo "这是一个远程调用的返回, 调用的服务名是", $callinfo["method"],
". 调用的sequence是 " , $callinfo["sequence"] , "\n";
var_dump($retval);
}
} // 异常回调
public function error_callback($type, $error, $callinfo)
{
error_log(json_encode(func_get_args() ),,'rpc.log' );
} }

  客户端调用:

<?php
namespace app\index\logic; // 相关测试
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',[,],false,'callback');
$this->call($api,'userBase',[],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调用

php扩展之Yar的更多相关文章

  1. 初始化 Ubuntu Trusty 14.04

    1. 软件源 sudo vim /etc/apt/source.list # 将软件源改为 sohu 的 deb http://mirrors.sohu.com/ubuntu/ trusty main ...

  2. php 安装yar扩展

    git:https://github.com/laruence/yar 先克隆 如果没有 git 需要先安装 yum install git 然后 克隆 git clone https://githu ...

  3. yar框架使用笔记

    Yar是什么 Yar是并行的RPC框架(Concurrent RPC framework),Laruence开发. 安装 下载地址:http://pecl.php.net/package/yar wi ...

  4. yar粗略使用记录

    yar是鸟哥(laruence)开发的一个并行的RPC框架.据说sina weibo已经在大规模使用这个框架了.今天初步使用了下,觉得还是挺爽的一个工具. 什么情况适用这个工具呢? 比如一般你有个微博 ...

  5. YAR 并行RPC框架研究

    前几天,部门召开了PHP技术峰会 学习会议,大家分别对这次会议的PPT 做了简单的介绍, 其中提到了 鸟哥[惠新辰]的一篇PPT<微博LAMP 演变>,如果谁有需要可以去谷歌搜,或者去 h ...

  6. PHP 7下安装Swoole和Yar、Yaf

    安装步骤 1.wget -c https://github.com/swoole/swoole-src/archive/v2.0.8.tar.gz  百度盘链接:https://pan.baidu.c ...

  7. RPC框架yar安装

    官方网站: http://pecl.php.net/package/msgpack http://pecl.php.net/package/yar 先安装 msgpack $ git clone ht ...

  8. PHP安装加载yaf扩展

    Yaf,全称 Yet Another Framework,是一个C语言编写的PHP框架,是一个用PHP扩展形式提供的PHP开发框架, 相比于一般的PHP框架, 它更快. 它提供了Bootstrap, ...

  9. linux下安装msgpack,yar,phalcon

    安装msgpack扩展 下载:http://pecl.php.net/package/msgpack cd /usr/local tar zxvf msgpack-0.5.5.tgz cd msgpa ...

随机推荐

  1. 为什么不要使用 async void?

    问题 在使用 Abp 框架的后台作业时,当后台作业抛出异常,会导致整个程序崩溃.在 Abp 框架的底层执行后台作业的时候,有 try/catch 语句块用来捕获后台任务执行时的异常,但是在这里没有生效 ...

  2. springboot~mockMvc和asciidoctor生成基于TDD的API文档

    API文档是前端与后端快速开发,减少沟通成本的必要条件,有一份完善的文档是很必要的,由通过测试来生成文档的好处就是:测试数据有了,测试返回结果有了,而且可以对这些字段进行说明,很清晰,在springb ...

  3. 从B站的代码泄露事件中,我们能学到些什么?

    先声明一下,本文不聊ISSUE中的七七八八,也不聊代码是否写的好,更不聊是不是跟蔡徐坤有关之类的吃瓜内容.仅站在技术人的角度,从这次的代码泄露事件,聊聊在代码的安全管理上,通常都需要做哪些事来预防此类 ...

  4. Spring Cloud Alibaba基础教程:Sentinel使用Nacos存储规则

    通过上一篇<使用Sentinel实现接口限流>的介绍,相信大家对Sentinel已经有了初步的认识.在Spring Cloud Alibaba的整合封装之下,接口限流这件事情可以非常轻易的 ...

  5. Java虚拟机判定对象存活算法

    1.引用计数算法 描述:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时刻计数器值为0的对象就是不可能再被使用的. 特点:实现简单,判定效率高. ...

  6. Java学习点滴——Class和反射

    基于<Java编程思想>第四版 前言 我们要操作一个类实例对象时,一般都要先知道这个类有哪些方法或者成员变量.反射就是在我们不知道这个类有哪些方法或成员变量时,使用特定方式得到类的这些信息 ...

  7. c#调用word文件

    大家好!我叫蓝颜,我是一名大专生.这是我第一次接触博客园,以后也会一直在. 在学校期间,参加技能大赛(物联网),接触到的C#.之后学校教务处要一个调课软件, 于是我就小试牛刀试了试.当然了,这也是我第 ...

  8. IO流-输入输出的简单实例

    InputStream和OutputStream 抽象类InputStream和OutputStream是IO流最底层的两个抽象类,所有输入/输出流的类都基于这两个类. 这两个类里最核心的三个方法是r ...

  9. 看完我身边前卫时尚女孩的手机 这几款APP强烈推荐

    爱美之心,人皆有之,爱美是所有人生追求里最有价值的生活状态,美是一种能力,更是一种修养,懂得打扮自己的女人更受欢迎 因为她们懂得什么是美.想要变美的女孩们不要着急,下面几款爱美工具定会让你一见钟情. ...

  10. 关于C++11右值引用和移动语义的探究

    关于C++11右值引用和移动语义的探究