PHP 使用 hprose RPC 服务 系列文章之二——Codeigniter3中使用Hprose
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相关推荐
- oracle迁移postsql的,osdba's blog : Oracle迁移PostgreSQL系列文章之二:merge语句
Oracle迁移PostgreSQL系列文章之二:merge语句 Posted on 2015-03-06 11:12:46 by osdba 我们知道,Oracle中有一个特别的merge语句.而P ...
- 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇...
一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...
- DM 源码阅读系列文章(二)整体架构介绍
2019独角兽企业重金招聘Python工程师标准>>> 作者:张学程 本文为 DM 源码阅读系列文章的第二篇,第一篇文章 简单介绍了 DM 源码阅读的目的和规划,以及 DM 的源码结 ...
- openstack系列文章(二)
学习openstack的系列文章-keystone openstack 架构 Keystone 基本概念 Keystone 工作流程 Keystone Troubleshooting 1. open ...
- 【理解 Cilium 系列文章】(二) 理解网络数据包的流转过程
Cilium 作为近两年最火的云原生网络方案,可谓是风头无两.作为第一个通过 ebpf 实现了 kube-proxy 所有功能的网络插件,它的神秘面纱究竟是怎样的呢?本系列文章将带大家一起来慢慢揭晓 ...
- 云服务系列文章(一) 阿里云和AWS
[怒草 https://blog.csdn.net/visionliao/article/details/108055806 未经允许严禁转载,请尊重作者劳动成果.] 概述 "云" ...
- html5 Game开发系列文章之 二 精灵(下)
昨天在家装了IE9,感觉不错,界面终于清爽了,跑HTML5也还不错!期待IE10正式版! 上一节我简单了介绍了HTML5 canvas 中的 drawImage方法,并绘制了一条扇动翅膀的小红龙,那么 ...
- TiKV 源码解析系列文章(二)raft-rs proposal 示例情景分析
作者:屈鹏 本文为 TiKV 源码解析系列的第二篇,按照计划首先将为大家介绍 TiKV 依赖的周边库 raft-rs .raft-rs 是 Raft 算法的 Rust 语言实现.Raft 是分布式领域 ...
- IL系列文章之二:Make Best Use of Our Tools
工欲善其事,必先利其器.这一节我谈的就是我们用于研究IL的工具. 第一篇文章贴出来之后,网上有朋友问我"能不能看到c#程序的IL代码?".看来还有些朋友对IL的编译与反编译还不太熟 ...
最新文章
- 正则表达式——全部符号解释(详解)
- Linux基础命令---lpr
- 初学echart的简单使用
- linux安装apache+mysql+php3.8练习环境
- 实验11 链表 程序1奇数值结点链表
- 《文明之光 第一册》一一7.1 第一节 佛罗伦萨的往昔(1)
- 上海python工资一般多少-python数据分析师待遇有多少?工资待遇如何?
- iis反向代理tomcat
- 函数式编程能否支持更高效的区块链基础设施?
- 【优化算法】静电放电优化算法(ESDA)【含Matlab源码 1439期】
- 通过IE私有滤镜让IE6 7 8支持背景透明,内容不透明效果
- python windows自动化 爬虫_python自动化之爬虫原理及简单案例
- 矩阵A的值域空间和其零空间
- Python无法打开.xlsx文件:xlrd.biffh.XLRDError: Excel xlsx file; not supported
- LeetCode-1276. 不浪费原料的汉堡制作方案
- 基于FPGA的目标颜色识别追踪三——FIFO(同/异步FIFO)、DDR3
- mariadb ROW格式复制下从库结构变更引发1677错误
- hackinglab-脚本关5——逗比验证码第一期
- 分省/市政府性债务数据财政收支数据财政透明度
- 乔列斯基(Cholesky)法解方程(python,数值积分)
热门文章
- 简约蓝绿岗位竞聘PPT模板
- 计算机故障报警声2声,电脑报警声含义大全 主板警报声判断故障
- 计算机院校都看重保研er的哪些能力?
- 5.7.24mysql 配置安卓,安卓按键精灵连接MySQL全面解析Windows下安装 mysql5.7的方法
- Wireless Communication学习笔记-路径损耗,阴影和多径效应
- 培训php包装自己的简历,用一流的简历包装自己
- C语言实现关机功能(超详解)
- natapp 外网映射本地
- python开源ide_前5个开源Python IDE
- 【全网最全】JSR303参数校验与全局异常处理(从理论到实践别用if判断参数了)