RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

ThinkPHP支持广泛的RPC协议,包括PHPRPC、HPRose、JsonRPC以及Yar。

PHPRPC支持

PHPRPC 是一个轻型的、安全的、跨网际的、跨语言的、跨平台的、跨环境的、跨域的、支持复杂对象传输的、支持引用参数传递的、支持内容输出重定向的、支持分级错误处理的、支持会话的、面向服务的高性能远程过程调用协议。目前该协议的最新版本为 3.0。详细的资料可以参考phprpc官网( http://www.phprpc.org/zh_CN/)

ThinkPHP提供了对PHPRpc的服务端和客户端调用的支持(客户端是跨平台跨语言的,可以支持任何语言的调用)。

服务器端的实现非常简单,你只需要把控制器继承Think\Controller\RpcController类即可。

例如:

  1. namespace Home\Controller;
  2. use Think\Controller\RpcController;
  3. class ServerController extends RpcController{
  4. public function test1(){
  5. return 'test1';
  6. }
  7. public function test2(){
  8. return 'test2';
  9. }
  10. private function test3(){
  11. return 'test3';
  12. }
  13. protected function test4(){
  14. return 'test3';
  15. }
  16. }

这样,ServerController控制器就变成了一个PHPRpc服务端,请求地址为:

  1. http://serverName/index.php/Home/Server

rpc客户端可以调用test1test2方法。方法的返回值可以支持数组等PHPRpc支持的格式。

注意:如果设置了不同的URL模式的话,服务器端请求地址需要相应调整。

可以使用allowMethodList属性设置允许访问的方法列表,例如:

  1. namespace Home\Controller;
  2. use Think\Controller\RpcController;
  3. class ServerController extends RpcController{
  4. protected $allowMethodList = array('test1','test2');
  5. public function test1(){
  6. return 'test1';
  7. }
  8. public function test2(){
  9. return 'test2';
  10. }
  11. public function test3(){
  12. return 'test3';
  13. }
  14. }

上面的设置表示只允许test1test2方法被rpc客户端调用。

你可以采用多个控制器进行不同的PHPRpc Server端用于不同的需要。

如果要在ThinkPHP里面进行客户端调用,可以使用下面的代码:

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. class IndexController extends Controller {
  4. public function index(){
  5. Vendor('phpRPC.phprpc_client');
  6. $client = new \PHPRPC_Client('http://serverName/index.php/Home/Server');
  7. // 或者采用
  8. //$client = new \PHPRPC_Client();
  9. //$client->useService('http://serverName/index.php/Home/Server');
  10. $result = $client->test1();
  11. }
  12. }

其中test1就是服务器端定义的方法。其他使用和PHP的方法调用一致。

Hprose支持

Hprose (High Performance Remote Object Service Engine) 是一个MIT开源许可的新型轻量级跨语言跨平台的面向对象的高性能远程动态通讯中间件。它支持众多语言,例如nodeJs, C++, .NET, Java, Delphi, Objective-C, ActionScript, JavaScript, ASP, PHP, Python, Ruby, Perl 等语言,通过 Hprose 可以在这些语言之间实现方便且高效的互通。

你可以认为它是 PHPRPC 的商业版本,但是它跟 PHPRPC 完全不同,hprose 协议是全新设计的,比 PHPRPC 更加高效,实现也完全是全部从头开始的,比 PHPRPC 更加易用。更多信息可以参考(http://www.hprose.com/)

ThinkPHP同样也提供了对Hprose的服务端和客户端调用的支持。

服务器端的使用和PHPRPC的区别只是把控制器继承Think\Controller\HproseController类即可,其他用法基本一致,例如:

  1. namespace Home\Controller;
  2. use Think\Controller\HproseController;
  3. class ServerController extends HproseController{
  4. public function test1(){
  5. return 'test1';
  6. }
  7. public function test2(){
  8. return 'test2';
  9. }
  10. }

我们可以进行一些hprose服务器端的参数设置,包括debug、crossDomain、P3P和get,设置方法如下:

  1. namespace Home\Controller;
  2. use Think\Controller\HproseController;
  3. class ServerController extends HproseController{
  4. protected $crossDomain = true;
  5. protected $P3P = true;
  6. protected $get = true;
  7. protected $debug = true;
  8. public function test1(){
  9. return 'test1';
  10. }
  11. public function test2(){
  12. return 'test2';
  13. }
  14. }

采用ThinkPHP的Hprose的客户端调用示例如下:

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. class IndexController extends Controller {
  4. public function index(){
  5. vendor('Hprose.HproseHttpClient');
  6. $client = new \HproseHttpClient('http://serverName/index.php/Home/Server');
  7. // 或者采用
  8. //$client = new \HproseHttpClient();
  9. //$client->useService('http://serverName/index.php/Home/Server');
  10. $result = $client->test1();
  11. }
  12. }

JsonRPC支持

json-rpc是基于json的跨语言远程调用协议,比xml-rpc、webservice等基于文本的协议传输数据格小;相对hessian、java-rpc等二进制协议便于调试、实现、扩展,是非常优秀的一种远程调用协议。

ThinkPHP3.2提供了对JsonRPC的服务器端和客户端调用支持,服务器端实现示例:

  1. namespace Home\Controller;
  2. use Think\Controller\JsonRpcController;
  3. class ServerController extends JsonRpcController {
  4. public function index(){
  5. return 'Hello, JsonRPC!';
  6. }
  7. // 支持参数传入
  8. public function test($name=''){
  9. return "Hello, {$name}!";
  10. }
  11. }

所有的public方法都可以用于远程调用,客户端调用方式如下:

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. class IndexController extends Controller {
  4. public function index(){
  5. vendor('jsonRPC.jsonRPCClient');
  6. $client = new \jsonRPCClient('http://serverName/index.php/Home/Server');
  7. $result = $client->index();
  8. var_dump($result); // 结果:Hello, JsonRPC!
  9. $result = $client->test('ThinkPHP');
  10. var_dump($result); // 结果:Hello, ThinkPHP!
  11. }
  12. }

Yar支持

Yar (yet another RPC framework) 是一个PHP扩展的RPC框架, 和现有的RPC框架(xml-rpc, soap)不同, 这是一个轻量级的框架, 支持多种打包协议(msgpack, json, php), 并且最重要的一个特点是, 它是可并行化的。

要使用Yar支持首先需要安装Yar扩展,扩展下载地址: http://pecl.php.net/package/yar

Yar说明文档: http://hk2.php.net/manual/zh/book.yar.php

安装好扩展后,使用ThinkPHP就可以开发服务器端,示例如下:

  1. namespace Home\Controller;
  2. use Think\Controller\YarController;
  3. class ServerController extends YarController {
  4. public function index(){
  5. return 'Hello, Yar RPC!';
  6. }
  7. public function hello($name=''){
  8. return 'Hello, {$name}!';
  9. }
  10. }

Yar除了并行,还有一个亮点,通过GET方式可以查看到接口列表及注释。

客户端调用示例如下:

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. class IndexController extends Controller {
  4. public function index(){
  5. $client = new \Yar_client('http://serverName/index.php/Home/Server');
  6. $result = $client->index();
  7. var_dump($result); // 结果:Hello, Yar!
  8. }
  9. }

thinkphp rpc的更多相关文章

  1. 关于 thinkPHP Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback

    Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback 关于thinkPHP rpc调 ...

  2. workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的)

    workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的) 一.总结 1.下面链接里面还有一个来聊的php聊天室源码可以学习 2. ...

  3. 2017-07-26 ThinkPHP简单使用

    ThinkPHP是什么?有何优点? ThinkPHP 是一个免费开源的,快速.简单的面向对象的 轻量级PHP开发框架,ThinkPHP为WEB应用开发提供了强有力的支持,这些支持包括: * MVC支持 ...

  4. 利用Metasploit 打入ThinkPHP内网...

    出品|MS08067实验室(www.ms08067.com) 本文作者:dch(Ms08067实验室 SRSP TEAM小组成员) 一.利用Metasploit进行攻击的流程图   Metasploi ...

  5. 从RPC开始(一)

    这是一篇关于纯C++RPC框架的文章.所以,我们先看看,我们有什么? 1.一个什么都能干的C++.(前提是,你什么都干了) 2.原始的Socket接口,还是C API.还得自己去二次封装... 3.C ...

  6. 制作类似ThinkPHP框架中的PATHINFO模式功能

    一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...

  7. RPC 使用中的一些注意点

    最近线上碰到一点小问题,分析其原因发现是出在对 RPC 使用上的一些细节掌握不够清晰导致.很多时候我们做业务开发会把 RPC 当作黑盒机制来使用,但若不对黑盒的工作原理有个基本掌握,也容易犯一些误用的 ...

  8. 谈谈如何使用Netty开发实现高性能的RPC服务器

    RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络,从远程计算机程序上请求服务,而不必了解底层网络技术的协议.说的再直白一点,就是客户端在不必知道 ...

  9. 游戏编程系列[1]--游戏编程中RPC协议的使用[3]--体验

    运行环境,客户端一般编译为.Net 3.5 Unity兼容,服务端因为用了一些库,所以一般为4.0 或往上.同一份代码,建立拥有2个项目.客户端引用: WindNet.Client服务端引用: OpL ...

随机推荐

  1. Android processDebugManifest 异常

    1.使用 gradlew processDebugManifest --stacktrace 进行排查; 2.异常: processDebugManifest (Thread[Execution wo ...

  2. hibernate 双向1对多

    1: 还是用客户Customer和订单Order来解释: “一对多”的物理意义:一个客户可以有多个订单,某个订单只能归宿于一个客户. “双向”的物理意义:客户知道自己有哪些订单,订单也知道自己归宿于哪 ...

  3. Kattis - boxes (LCA)

    Boxes There are NN boxes, indexed by a number from 11 to NN. Each box may (or not may not) be put in ...

  4. POJ 3159 Candies(spfa、差分约束)

    Description During the kindergarten days, flymouse was the monitor of his class. Occasionally the he ...

  5. CF 1045 H. Self-exploration 解题报告

    CF 1045 H. Self-exploration 考虑到串的结构一定是 1...0....1....0.....1... 这样的,而\(01\)与\(10\)在转折点交替出现 首先串长一定是\( ...

  6. 【Linux】【Fabric】在ubuntu容器中安装Fabric环境

    前言 想在docker容器中安装docker部署fabric网络,有了以下尝试. 尝试了centos镜像.redhat镜像都没解决docker容器中安装运行docker的问题,最后ubuntu成功了! ...

  7. 基于jquery和bootstrap的下拉框左右选择功能

    实现如图选择的功能,可以用基于bootstrap的样式,结合jquery事件: <div class="row"> <div class="col-xs ...

  8. Android学习--apk打包过程

    1. 使用aapt工具,给所有的res目录下的资源文件生成对应的id,id会被放进R.java文件中 2. JavaC编译器,将所有Java文件转换为Class文件,其中,内部类会分别生成.class ...

  9. [CSP-S模拟测试72]题解

    A.简单的序列 遇到括号匹配,先将左右括号转化为1和-1. 那么一个括号序列合法的必要条件:总和为0且所有时刻前缀和$\ge 0$. 用dp预处理出长度为$i$,总和为$j$的括号序列数量.那么如果p ...

  10. js打印窗口内容并当窗口内容较长时自动分页

    项目环境Angular: 方法1.window.print() HTML页面上的代码: <div id="tenementBillTable" class="dia ...