rpc是啥这不多解释,php扩展实现rpc

yar是鸟哥的写的扩展,实现简单的rpc.比较很好理解

windows安装yar

http://pecl.php.net/package/yar/2.0.4/windows

下载扩展,安装即可

<?php

class Test
{
public function Hello()
{
return 'Hello world';
}
} $service = new Yar_Server(new Test);
$service->handle();
<?php

$client = new Yar_Client('http://localhost:8888/server.php');

$res = $client->Hello();

var_dump($res);

用Yar扩展实现RPC
RPC (Remote Procedure Call),远程过程调用。是一种进程间通信技术,允许程序像调用本地方法一样调用远程服务。

RPC屏蔽了数据打包、网络通信的细节,使得使用者只需要关注于服务调用,而服务调用又像调用本地方法一样自然。

PHP有个Yar扩展,提供了RPC服务端和客户端的功能。

1. 安装
$ pecl install yar
1
稍候片刻,即可装好。

然后在php.ini中加入如下一行:

extension=yar.so
1
2.Yar介绍
目前只需要关注Yar提供的两个类就行了:Yar_Server和Yar_Client。

2.1 Yar_Server
Yar_Server提供了创建RPC服务端相关的功能。该类大致如下:

Yar_Server {
/* 属性 */
protected $_executor ;
/* 方法 */
final public __construct (Object $obj)
public boolean handle (void)
}

__construct 方法接收一个对象,创建一个RPC服务,该对象的public方法便可由RPC客户端调用
handle 方法用于启动RPC服务
使用方式如下:

$server = new Yar_Server(new Service());
$server->handle();
1
2
2.2 Yar_Client
Yar_Client提供了创建RPC客户端相关的功能。该类大致如下:

Yar_Client {
/* 属性 */
protected $_protocol ;
protected $_uri ;
protected $_options ;
protected $_running ;
/* 方法 */
public void __call (string $method , array $parameters)
final public __construct (string $url)
public boolean setOpt (number $name , mixed $value)
}

__construct 方法的参数是RPC服务端对应的URL
使用方式如下:

$client = new Yar_Client("http://....");
$result = $client->someMethod($arg0, $arg1); // 调用RPC服务端中相应对象的 someMethod方法
1
2
Yar扩展的更多介绍见: http://php.net/manual/zh/book.yar.php

3. 使用示例
下面是一个在PHP框架中使用Yar创建RPC服务,然后在脚本中调用的例子。

3.1 RPC服务端
3.1.1 RPC服务类
该类是RPC服务的实际提供者。Service.php

<?php

namespace app\agent\lib;

class Service
{
public function __constrict()
{
}

public function add($a, $b)
{
return $a + $b;
}

public function sub($a, $b)
{
return $a - $b;
}
}
3.1.2 RPC包装类
用Yar扩展将上面的Service类包装成RPC服务。Rpc.php

<?php

namespace app\agent\controller;

use app\agent\lib\Service;

class Rpc extends \think\Controller
{
public function _initialize()
{
parent::_initialize();
}

public function index()
{
$rpcServer = new \Yar_Server(new Service());
$rpcServer->handle();
}
}

该RPC服务的访问路径是:

http://localhost/agent/rpc/index
1
用浏览器访问:http://localhost/agent/rpc/index:

默认情况下配置yar.expose_info是开着的,安全起见,把它关闭。

yar.expose_info = Off
1
3.2 RPC客户端
RPC客户端如下(rpc.php):

<?php

$client = new Yar_Client("https://localhost/agent/rpc/index");

try {
$result = $client->add(1, 5); // 调用RPC服务端提供的add方法
echo "result=", $result, PHP_EOL;
} catch (Exception $e) {
echo "Exception: ", $e->getMessage();
}

3.3 测试结果
命令行中运行RPC客户端:

$ php rpc.php
1
输出如下:

result=6
1
说明调用成功。

php实现rpc简单的方法的更多相关文章

  1. go-micro开发RPC服务的方法及其运行原理

    go-micro是一个知名的golang微服务框架,最新版本是v4,这篇文章将介绍go-micro v4开发RPC服务的方法及其运作原理. 基本概念 go-micro有几个重要的概念,后边开发RPC服 ...

  2. MySQL笔记-最简单的方法来解决找不到mysqld.sock文件的问题

    首先,环境:ubuntu 14.04,采用apt-get的方式安装的,手动安装可能路径设置稍有区别. 1.安装MySQL后,用命令行首次启动时发现找不到Mysqld.sock文件,提示: ERROR ...

  3. mfc显示静态图片最简单的方法

    一致都是研究如何调用opencv显示动态图片,但是很多时候在显示图标的时候,都是需要显示静态图片,现在将最简单的方法总结下: 1.添加picture控件 2.添加资源,要求为bmp 3.修改属性 结果 ...

  4. ECshop设置301最快捷最简单的方法

    ECshop设置301最快捷最简单的方法 在 init.php中加入以下代码 if (strtolower($_SERVER['SERVER_NAME'])!='www.fz1688.com') { ...

  5. git 的简单使用方法

    git 的简单使用方法1. 服务器 安装完成2. ssh 中的账号创建完成3. 创建 ssh 账号,会在 ssh 的安装目录下的home 目录里面,多了用户家目录4. 进入该目录 ,创建一个新的文件夹 ...

  6. JavaScript,一个超级简单的方法判断浏览器的内核前缀

    先说明,此处的方法是说超级简单的方法,不是指代码超级少,而是用非常简单的知识点,只要懂得怎么写JavaScript的行内样式就可以判断. 大家应该还记得JavaScript行内样式怎么写吧?(看来我是 ...

  7. NET MVC1项目升级到MVC2最简单的方法

    NET MVC1项目升级到MVC2最简单的方法 把MVC1项目升级到MVC2,最简单的做法如下: 新建MVC2项目 新建一个MVC2项目,把原来MVC1的项目文件全部拷贝到新建MVC2项目目录里,依照 ...

  8. js 获取当天23点59分59秒 时间戳 (最简单的方法)

    js 获取当天23点59分59秒 时间戳 (最简单的方法) new Date(new Date(new Date().toLocaleDateString()).getTime()+24*60*60* ...

  9. [ASP.NET]更简单的方法:FormsAuthentication登录ReturnUrl使用绝对路径

    转自:http://www.cnblogs.com/dudu/p/formsauthentication-returnurl-absoluteuri.html [ASP.NET]更简单的方法:Form ...

随机推荐

  1. ViewPager与Fragment刷新数据

    唉,每次都忘记怎么写,还是老老实实记一下吧! public class MDTabViewPagerAdapter extends FragmentStatePagerAdapter { privat ...

  2. 转:String数组初始化

    近日,笔者在java编程中因为疏忽对String数组的初始化定义错误,导致程序运行出错.现将所理解的String数组在此进行说明,并对String数组初始化进行分析. //一维数组String[] s ...

  3. eclipse bug之'<>'operator is not allowed for source level below 1.7

    eclipse中导入工程,报这个错'<>'operator is not allowed for source level below 1.7,把jdk改成1.7后,提示Android r ...

  4. 破解电信光猫华为HG8120C关闭路由功能方法

    昨天电信的工作人员来安装了电信的光纤宽带,使用的是华为HG8120C这款光电转换器与路由器一体机 这导致下级路由无法直接使用PPPOE拨号连接到互联网,且无法使用端口映射来实现外网访问 而华为开放给用 ...

  5. webpack-Module Resolution(模块解析)

    模块解析(Module Resolution) resolver 是一个库(library),用于帮助找到模块的绝对路径.一个模块可以作为另一个模块的依赖模块,然后被后者引用,如下: import f ...

  6. 为什么java构造函数的构造器只能在第一行写this() 或者super() ?

    最近在看内部类, 但是被“为什么匿名内部类或者局部内部类使用方法的局部变量时, 局部变量一定得是final类型”困扰着, 在网上查找资料的时候, 发现我对类初始化完全不了解, 之前的认识都是错误! 所 ...

  7. redis缓存数据库的详解

    1,什么是redis? Redis是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库 Redis与其他key-value缓存产品有以下三个特点: Redis支持数据的持久化,可以 ...

  8. su 和 su- 会影响环境变量

    大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户,Linux中切换用户的命令是su或su -,下面就su命令和 ...

  9. 契约式设计 契约式编程 Design by contract

    Design by contract - Wikipedia https://en.wikipedia.org/wiki/Design_by_contract What is the use of & ...

  10. 使用css属性line-height实现文字垂直居中的问题

    使用css属性line-height实现文字垂直居中的问题 1.使用css属性line-height实现文字垂直居中 方法比较简单,但是只能实现单行文字的垂直居中. 单行垂直居中效果如下:   要是p ...