PHP 使用 hprose RPC 服务 系列文章之一——安装扩展
PHP 使用 hprose RPC 服务 系列文章之二——Codeigniter3中使用Hprose
PHP 使用 hprose RPC 服务 系列文章之三——Laravel5.8中使用Hprose

文章目录

  • 引入hprose
  • 关于路由
  • 添加server和client方法
  • 控制器
  • 测试用例
  • 项目实战
  • 总结

引入hprose

这里使用 hprose/hprose。
hprose github地址
hprose github文档

  • composer.json添加hprose包

    "require": {"hprose/hprose": "*"
    },
    

    要安装最新版的话需要将 * 替换为 dev-master
    添加后在项目根目录执行 composer update 即可。

  • composer 下载hprose包
    执行如下命令:

    composer require hprose/hprose
    

    本文选用v2.0.40版本hprose。

关于路由

CI3框架可以设定路由,也可以不设置,由于我项目中直接根据目录进行访问作为路由,此处就不设定路由了,读者如使用可路由,依照路由访问也没问题。

添加server和client方法

如果你的CI3项目扩展了命名空间,那么你也可以使用HproseTrait类的方式扩展控制器类(参考第三篇文章 Laravel+Hprose),这样更加合理。如果没有命名空间的概念,那么写一个Hprose_lib类库放在 application/libraries 目录下,添加server和client方法,如下:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');use Hprose\Http\Client;
use Hprose\Http\Server;class Hprose_lib
{private $CI;public function __construct(){$this->CI = &get_instance();}/*** 启动服务*/public function server(){$params = $this->CI->_params;$params = $params ?: $this->CI->input->get();$method = $params['method'];$server = new Server();$at_flag = $this->CI->input->server('access_token');if ($at_flag) {$server->header('access_token', $at_flag, '');}$server->addMethod($method, $this->CI);$server->start();}/*** 客户端请求* @return Client $client*/public function client(){$params = $this->CI->_params;$server_url = $params['server_url'];$is_sync = $params['is_sync'];$data = json_decode($params['data'], true);if ($is_sync) {$client = new Client($server_url, true);} else {$client = new Client($server_url, false);}$at_flag = $this->CI->input->server('access_token');if ($at_flag) {$client->setHeader('access_token', $at_flag);}return $client;}}

在公共控制器PS_Controller(自定义PS_前缀,默认是MY_前缀)添加启动服务的方法,这样在任何子级控制器都可以随意调用server方法进行启动server服务:

如上,手动加载Hprose_lib库文件,也可以自动加载。

一般情况下RPC客户端和服务端不在同一个项目里,server和client分别写在服务端项目和客户端项目里,这里都写在一个项目里了,便于调试,读者在实际使用中需留意。

控制器

  • 创建控制器文件,并添加相应方法:

    <?php
    defined('BASEPATH') OR exit('No direct script access allowed');class Hprose extends PS_Controller
    {public function __construct(){parent::__construct();}public function test(int $is_ret = 0, array $ct_data = []){$params = $this->_params;if (empty($params)) {$data = $ct_data;} else if (!empty($params) && array_key_exists('data', $params)) {$data = json_decode($params['data'], true);} else {$data = $params;}$res = "你好,{$data['name']}";$end = ['info' => $res];if ($is_ret) {return $end;} else {output_data($end);}}public function client_test(){$client = $this->hprose_lib->client();$params = $this->_params;$data = json_decode($params['data'], true);$res = $client->test(1, $data);output_data($res);}public function rpc_get_system_tree(){$client = $this->hprose_lib->client();$res = $client->get_system_tree(1);output_data($res);}
    }

测试用例

在postman中测试。

  • 启动服务
    GET方式访问路由 http://域名/hprose/v1/hprose/server?method=test 得到如下结果说明调用的方法服务启动:

    test即为控制器中的test方法。

  • 进行请求
    POST方式访问 http://域名/hprose/v1/hprose/client_test 进行客户端请求,返回如下效果,即为客户端请求成功(本地http调用可能出现超时,如遇到,不要慌,通过公网服务器访问即可):

    server_url:即为启动服务的地址,只是这里通过传参方式,此url必须和要远程调用的方法路由一致,除了最后的server方法,因为启动server就是注册远程调用的方法(如test、hello);
    is_sync:是否异步(0:否,1:是),此处值必传0;
    data:参数,具体项目开发过程中客户端要请求某个方法,一般都需要传参,以进行增删改查之类的操作,这里data对应的值就是需要远程调用方法的参数,具体格式可以自行调整。

项目实战

CI3项目使用过程中,可以直接返回查询到的数据,客户端获取结果之后直接返回json格式数据:



如上,客户端调用远程方法get_system_tree,直接返回查询结果的处理方式。

总结

以上的测试都是通过postman模拟浏览器进行的请求,实际项目中使用时在客户端项目中直接调用远程方法的,省去了浏览器传参及服务器收参的问题,读者在使用上述代码时应注意在自己项目中的调整。

****************************只要思想不滑坡,办法总比困难多****************************

PHP 使用 hprose RPC 服务 系列文章之二——Codeigniter3中使用Hprose相关推荐

  1. oracle迁移postsql的,osdba's blog : Oracle迁移PostgreSQL系列文章之二:merge语句

    Oracle迁移PostgreSQL系列文章之二:merge语句 Posted on 2015-03-06 11:12:46 by osdba 我们知道,Oracle中有一个特别的merge语句.而P ...

  2. 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇...

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  3. DM 源码阅读系列文章(二)整体架构介绍

    2019独角兽企业重金招聘Python工程师标准>>> 作者:张学程 本文为 DM 源码阅读系列文章的第二篇,第一篇文章 简单介绍了 DM 源码阅读的目的和规划,以及 DM 的源码结 ...

  4. openstack系列文章(二)

    学习openstack的系列文章-keystone openstack 架构 Keystone 基本概念 Keystone 工作流程 Keystone Troubleshooting 1.  open ...

  5. 【理解 Cilium 系列文章】(二) 理解网络数据包的流转过程

    Cilium 作为近两年最火的云原生网络方案,可谓是风头无两.作为第一个通过 ebpf 实现了 kube-proxy 所有功能的网络插件,它的神秘面纱究竟是怎样的呢?本系列文章将带大家一起来慢慢揭晓 ...

  6. 云服务系列文章(一) 阿里云和AWS

    [怒草 https://blog.csdn.net/visionliao/article/details/108055806 未经允许严禁转载,请尊重作者劳动成果.] 概述 "云" ...

  7. html5 Game开发系列文章之 二 精灵(下)

    昨天在家装了IE9,感觉不错,界面终于清爽了,跑HTML5也还不错!期待IE10正式版! 上一节我简单了介绍了HTML5 canvas 中的 drawImage方法,并绘制了一条扇动翅膀的小红龙,那么 ...

  8. TiKV 源码解析系列文章(二)raft-rs proposal 示例情景分析

    作者:屈鹏 本文为 TiKV 源码解析系列的第二篇,按照计划首先将为大家介绍 TiKV 依赖的周边库 raft-rs .raft-rs 是 Raft 算法的 Rust 语言实现.Raft 是分布式领域 ...

  9. IL系列文章之二:Make Best Use of Our Tools

    工欲善其事,必先利其器.这一节我谈的就是我们用于研究IL的工具. 第一篇文章贴出来之后,网上有朋友问我"能不能看到c#程序的IL代码?".看来还有些朋友对IL的编译与反编译还不太熟 ...

最新文章

  1. 正则表达式——全部符号解释(详解)
  2. Linux基础命令---lpr
  3. 初学echart的简单使用
  4. linux安装apache+mysql+php3.8练习环境
  5. 实验11 链表 程序1奇数值结点链表
  6. 《文明之光 第一册》一一7.1 第一节 佛罗伦萨的往昔(1)
  7. 上海python工资一般多少-python数据分析师待遇有多少?工资待遇如何?
  8. iis反向代理tomcat
  9. 函数式编程能否支持更高效的区块链基础设施?
  10. 【优化算法】静电放电优化算法(ESDA)【含Matlab源码 1439期】
  11. 通过IE私有滤镜让IE6 7 8支持背景透明,内容不透明效果
  12. python windows自动化 爬虫_python自动化之爬虫原理及简单案例
  13. 矩阵A的值域空间和其零空间
  14. Python无法打开.xlsx文件:xlrd.biffh.XLRDError: Excel xlsx file; not supported
  15. LeetCode-1276. 不浪费原料的汉堡制作方案
  16. 基于FPGA的目标颜色识别追踪三——FIFO(同/异步FIFO)、DDR3
  17. mariadb ROW格式复制下从库结构变更引发1677错误
  18. hackinglab-脚本关5——逗比验证码第一期
  19. 分省/市政府性债务数据财政收支数据财政透明度
  20. 乔列斯基(Cholesky)法解方程(python,数值积分)

热门文章

  1. 简约蓝绿岗位竞聘PPT模板
  2. 计算机故障报警声2声,电脑报警声含义大全 主板警报声判断故障
  3. 计算机院校都看重保研er的哪些能力?
  4. 5.7.24mysql 配置安卓,安卓按键精灵连接MySQL全面解析Windows下安装 mysql5.7的方法
  5. Wireless Communication学习笔记-路径损耗,阴影和多径效应
  6. 培训php包装自己的简历,用一流的简历包装自己
  7. C语言实现关机功能(超详解)
  8. natapp 外网映射本地
  9. python开源ide_前5个开源Python IDE
  10. 【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)