php实现rpc简单的方法
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简单的方法的更多相关文章
- go-micro开发RPC服务的方法及其运行原理
go-micro是一个知名的golang微服务框架,最新版本是v4,这篇文章将介绍go-micro v4开发RPC服务的方法及其运作原理. 基本概念 go-micro有几个重要的概念,后边开发RPC服 ...
- MySQL笔记-最简单的方法来解决找不到mysqld.sock文件的问题
首先,环境:ubuntu 14.04,采用apt-get的方式安装的,手动安装可能路径设置稍有区别. 1.安装MySQL后,用命令行首次启动时发现找不到Mysqld.sock文件,提示: ERROR ...
- mfc显示静态图片最简单的方法
一致都是研究如何调用opencv显示动态图片,但是很多时候在显示图标的时候,都是需要显示静态图片,现在将最简单的方法总结下: 1.添加picture控件 2.添加资源,要求为bmp 3.修改属性 结果 ...
- ECshop设置301最快捷最简单的方法
ECshop设置301最快捷最简单的方法 在 init.php中加入以下代码 if (strtolower($_SERVER['SERVER_NAME'])!='www.fz1688.com') { ...
- git 的简单使用方法
git 的简单使用方法1. 服务器 安装完成2. ssh 中的账号创建完成3. 创建 ssh 账号,会在 ssh 的安装目录下的home 目录里面,多了用户家目录4. 进入该目录 ,创建一个新的文件夹 ...
- JavaScript,一个超级简单的方法判断浏览器的内核前缀
先说明,此处的方法是说超级简单的方法,不是指代码超级少,而是用非常简单的知识点,只要懂得怎么写JavaScript的行内样式就可以判断. 大家应该还记得JavaScript行内样式怎么写吧?(看来我是 ...
- NET MVC1项目升级到MVC2最简单的方法
NET MVC1项目升级到MVC2最简单的方法 把MVC1项目升级到MVC2,最简单的做法如下: 新建MVC2项目 新建一个MVC2项目,把原来MVC1的项目文件全部拷贝到新建MVC2项目目录里,依照 ...
- js 获取当天23点59分59秒 时间戳 (最简单的方法)
js 获取当天23点59分59秒 时间戳 (最简单的方法) new Date(new Date(new Date().toLocaleDateString()).getTime()+24*60*60* ...
- [ASP.NET]更简单的方法:FormsAuthentication登录ReturnUrl使用绝对路径
转自:http://www.cnblogs.com/dudu/p/formsauthentication-returnurl-absoluteuri.html [ASP.NET]更简单的方法:Form ...
随机推荐
- Activity调用isDestroyed()方法报出,java.lang.NoSuchMethodError
在測试App的过程中,Activity调用了isDestroyed()方法,报出了java.lang.NoSuchMethodError错误. 自己手机MI 2S,版本号4.1.1. 事实上原因就是i ...
- 剑指Offer面试题43(Java版):n个骰子的点数
题目:把n个骰子仍在地上.全部骰子朝上一面的点数之和为s,输入n,打印出s的全部可能的值出现的概率. 解法一:基于递归求骰子的点数,时间效率不够高 如今我们考虑怎样统计每个点数出现的次数. 要向求出n ...
- java 生成压测数据
询价接口压测,需要批量生成数据, 数据包括4个字段(车牌号,车架号,发动机号,支付号)licenseNo,vehicleFrameNo,engineNo,payFlowId 需符合LoadRunner ...
- Hibernate也须要呵护——Hibernate的泛型DAO
众所周之.面向对象的基础是抽象.也能够说,抽象促使编程在不断发展. 对于数据库的訪问,以前写过HqlHelper.EFHelper.编写Spring+Hibernate框架下的应用.也相同离不了编写一 ...
- 将C++的标识符转成OC的标识符
3.将C++的标识符转成OC的标识符 C++的标识符和OC一样由数字字母下划线组成.打头的不是数字.当标识符超过一个单词, C++採用全字母小写.单词间用下划线连接的书写规范,如: bei_jing ...
- Hibernate基础-HelloWord
1. ORM :ORM (Object /Relation Mapping ): 对象/关系映射(理解) 1) ORM 主要解决对象 -关系的映射 2) .ORM的思想:将关系数据 ...
- Xcode6 设置LaunchImage图标
最近设置LaunchImage图标时发现怎么都没有效果,后来发现是Xcode6中新建项目的时候会默认添加一个LaunchScreen.xib的文件,我们启动程序的时候也会发现,加载的时LaunchSc ...
- 有oracle 10g,但没有安装arcgis,又想使用空间数据库的解决方案
我在一台虚拟机中部署系统进行测试,配置如下: OS:WIN2008 R2 SP1 X64 DB: oracle 12c 结果系统报错,查找原因,原来是oracle里还不支持arcgis的一些所谓的空间 ...
- 问题:IIS部署 MVC项目 (autofac) 错误解决
http://www.cnblogs.com/yelaiju/p/3375168.html Could not load file or assembly 'System.Core, Version= ...
- “千千静听”滚动标题栏,非常简单!(时间器控制窗口标题栏文字,然后赋值给Application.Title)
记得曾写过类似功能,但由于对Delphi数据类型不清楚,要花不少代码去处理中文被切半而出现乱码的尴尬.后来知道只需把字符串定义成 WideString 即可解决半个中文的问题了. 实现过程:不停地剪切 ...