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. Simics 破解 转

    http://www.eetop.cn/blog/html/28/1066428-type-bbs-view-myfav.html http://blog.sina.com.cn/s/blog_538 ...

  2. ffm算法

    www.csie.ntu.edu.tw/~cjlin/papers/ffm.pdf  读书笔记 The effect of feature conjunctions(组合特征) is difficul ...

  3. 【c++】面向对象程序设计之继承中的类作用域

    当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内. 一个对象.引用或指针的静态类型决定了该对象的哪些成员是可见的.即使静态类型与动态类型可能不一致,但我们使用哪些成员仍然是由静态类型决定的.基 ...

  4. XMLHttpRequest对象解读

    <!DOCTYPE html> <html> <body> <script> function reqListener () { console.log ...

  5. Error Code: 2006 - MySQL 鏈嶅姟鍣ㄥ凡绂荤嚎

    将sql文件导入到mysql时候,就一直报这个错误. 我试过网上各种方法都行不通. 最后将以下一句运行了一下就能够了,并且没有重新启动mysql. SET GLOBAL max_allowed_pac ...

  6. JAVA 并发编程-返回运行结果(Callable和Future)(九)

    启动一个线程不论使用Thread或者Runnable的时候.都是没有返回结果的. 也就是说Thread和Runnable的run()方法必须没有返回值. public void run(){} 解决方 ...

  7. JNI/NDK开发指南(2)

    1.生成动态库.so,存放于手机的system/lib/中(APP怎样将.so存入该文件夹,奇怪?????),Java层调用JNI的类会运行静态代码System.loadLibrary("* ...

  8. CronTab命令实例

    每2分钟 将date写入到time.log(以下的为奇数分钟运行) */2 * * * * date >> ~/time.log 1-59/2 * * * * date >> ...

  9. JavaScript语言基础4

    谈谈JavaScript 中的变量. 在JavaScript 中使用变量的优点:变量保存在计算机的内存中,变量很适合于保存暂时性的数据 ,变量仅仅具有有限的生存期,当 用户关闭了页面或者打开一个新的页 ...

  10. mysql -=- DDL

    net start mysql mysql -uroot -p show databases use 数据库名 how tables --------------------------------- ...