在项目开发的过程中有时候会涉及到对外提供接口供第三方程序调用或者是不同程序间需要相互通信,那么最通用的做法是用传统的SOAP方式来实现,用XML的文档格式来作为传输载体。但是这种方式不灵活,支持的数据结构类型单一,例如(不能返回json格式的数据),同时在javascript中处理冗长的SOAP依然很困难,对于浏览器有压力,也就是说当XML的内容过多时可能会存在性能问题。如果在项目中有以上需求,不妨考虑使用第三方开发的远程调用框架phprpc:http://www.phprpc.org/zh_CN/ 或 hprose:http://www.hprose.com/ 。如果你的项目没有用到php的任何框架(Yii,Thinkphp)等,那么你就可以直接使用,在网上例子也很多。本文主要介绍在Yii框架中使用的场景。以phprpc为例:

1.到phprpc官网下载最新的package,然后解压放到Yii框架的extensions目录,我存放的目录结构如下(我的extensions目录是位于myproject/protected/目录下的):

2.建立你对外提供的controll,命名为DemoController ,代码如下:

<?phpYii::import('application.extensions.*'); // load your extesions
//require_once('hprose/HproseHttpServer.php');
require_once('phprpc/phprpc_server.php'); // import phprpc_server component class DemoController extends CController {public function actionIndex() {$server = new PHPRPC_Server();$server->add('callHello',new DemoModel());$server->start();Yii::app()->end();}}?>

那么这里面有几点需要注意:

1.加载你的extensions目录,让它加载到Yii框架的运行环境中。

2.引入PHPrpc的server文件,因为我们在这里是搭建一个webservice,对外提供接口。

3.DemoController一般来说要继承原生态的CController,因为在默认的开发中一般都会继承Controller, 在这里建议不要继承Controller,因为在Yii框架中Controller里面包含了页面的layout信息。如果继承了Controller,那么在远程调用该service时会出现错误,目前在phprpc和hprose这2种框架中都会出现错误,原因是该Controller会输出HTML页面相关的信息。如果你需要继承自己自己特殊的controller也可以,只要确保该controller中没有HTML 相关的内容输出即可。

4.在添加你的业务逻辑方法时,注意add方法的第一个参数是方法名称,当然也是一个数组,可以使多个方法名,第二参数是该方法所在的对象实例。

在这里我把cllHello方法预先定义到DemoModel中,代码如下:

<?php
class DemoModel {public function callHello() {$helloInfo = array('name' => 'phprpc','version' => '3.0',);}$helloInfo = json_encode($helloInfo, true);return $helloInfo;}}
?>

当然了,如果你还有更多的方法需要添加到DemoModel中,那么为了调用这些方法方便,你只需要早demoController中做一个小小的改动:

<?phpYii::import('application.extensions.*'); // load your extesions
//require_once('hprose/HproseHttpServer.php');
require_once('phprpc/phprpc_server.php'); // import phprpc_server component class DemoController extends CController {public function actionIndex() {$demoObj = new DemoModel();$class_methods = get_class_methods(get_class($demoObj));$demo_methods = array();foreach($class_methods as $method_name){$demo_methods[] = $method_name;}$server = new PHPRPC_Server();$server->add($demo_methods,$demoObj);$server->start();Yii::app()->end();}}?>

目前来看,我们的server端已经ok了,例如demoController的访问路由是:http://your ip/yii_phprpc_demo/index.php?r=Demo/Index,当然了这里如果你在用YII框架提供的path机制在管理你的url,那么访问的路由会有变化,常见的有

2中,

1.hidden index.php ,那么路由地址为:http://your ip/yii_phprpc_demo/Demo/Index,大小写不区分.

2.不隐藏index.php,http://your ip/yii_phprpc_demo/index.php/Demo/Index.

这个url的管理很灵活,可以根据你自己的需求来配置,只要确保可以访问即可。

那么我现在编写我们的客户端(客户端代码路径位于/var/www/html/demo_client/):

同样把phprpc的相关组件解压放到demo_client/phprpc/下,同时在demo_client下新建demo_client.php

<?php
require_once("phprpc/phprpc_client.php");
$client = new PHPRPC_Client("http://your ip/yii_phprpc_demo/index.php?r=Demo/Index");
$helloInfo = $client->callHello();
print_r($helloInfo);
?>

这样就完成了客户端的编写。

对于phprpc的客户端还有一种就是在javascript 中来调用服务端的方法。前提是先下载phprpc_client.js,这个代码在github上有,你可以直接保存到本地。

同样在demo_client目录下建立demo_client.html 文件,截图如下:

好了,基本上完成了phprpc的server到client端的演示。

关于hprose的用法和phprpc差不多,只是各自封装的API有所变化而已。

转载于:https://www.cnblogs.com/stackflow/p/yii_phprpc.html

Yii框架中集成phprpc、hprose相关推荐

  1. Yii框架中使用SRBAC作为权限管理模块时遇到的问题

    Yii框架中使用SRBAC作为权限管理模块时遇到的问题 Yii框架中使用SRBAC作为权限管理模块时遇到的问题 看到Yii中提供RBAC的插件,SRBAC,就想用用. 结果按照手册上的安装办法,整来整 ...

  2. Yii框架中使用PHPExcel导出Excel文件

    Yii框架中使用PHPExcel导出Excel文件http://www.cnblogs.com/wgx214/p/3709521.html 转载于:https://www.cnblogs.com/fl ...

  3. 在 Yii框架中使用session 的笔记:

    在 Yii框架中使用session 的笔记: 首先,在Yii框架中,你不需要像标准PHP代码那样使用session_start(), 在Yii框架中,autoStart 属性缺省被设置为true,所以 ...

  4. php中yii的controller,详解PHP的Yii框架中的Controller控制器,yiicontroller

    详解PHP的Yii框架中的Controller控制器,yiicontroller 控制器是 MVC 模式中的一部分, 是继承yii\base\Controller类的对象,负责处理请求和生成响应. 具 ...

  5. go语言 gin框架中集成zap日志库

    在go语言gin框架中,日志是默认输出到终端的,但是我们在实际工作中,一般来说是需要记录服务器日志的.而最常用的日志库就是zap日志库,我们需要将gin在终端输出的内容通过zap日志库记录到文件中,首 ...

  6. php yii调试,yii框架中debug怎么用

    这里采用的是yii2的advanced的版本.配置接口访问的debug模式. 配置文件目录: frontend/config/main-local.php (推荐教程:yii框架) 配置内容:if ( ...

  7. OEA 框架中集成的 RDLC 报表介绍

    之前 OEA 一直用着一个 Delphi 开发的报表,所以两年来我一直就想在 OEA 中构建一个纯 .NET 的报表模块,但是一想到要开发复杂的报表引擎和设计器就觉得麻烦.所以这事一直拖着.最近开始研 ...

  8. Yii框架中setFlash和getFlash函数的用法

    设置键值名为success的临时信息,在getFlash后删除,可以定义多种不同的键值名对象的消息: <?php Yii::app()->user->setFlash('succes ...

  9. php behaviors,详解在PHP的Yii框架中使用行为Behaviors的方法_php技巧

    一个绑定了行为的类,表现起来是这样的: // Step 1: 定义一个将绑定行为的类 class MyClass extends yii\base\Component { // 空的 } // Ste ...

最新文章

  1. Virtual Box 工具栏(菜单栏)消失的解决方法
  2. SD卡FAT32文件系统格式
  3. (Mark)操作系统原理
  4. Github之深入解析Ruby Gems缓存
  5. 一个亿万富翁和一个陌生人的换钱计划
  6. HRESULT:0x80070057 (E_INVALIDARG)的异常的解决方案
  7. shell习题第22题:
  8. hbase数据结构小结
  9. Activity详解(生命周期、以各种方式启动Activity、状态保存,完全退出等)
  10. Java使用冒泡排序对数据进行排序,带注释
  11. Android游戏开发源码案例25个汇总
  12. 人工智能:智能优化算法
  13. 《图书管理系统》需求分析
  14. 止增笑耳的星际迷航前传
  15. whether 连词或代词词性都不能作为疑问词
  16. androidの读取短信内容
  17. (转)东方美人吉他谱及演奏(中川砂仁)
  18. IOS视频分解图片、图片合成视频
  19. 打印机相关的c语言程序,VC下打印机的使用
  20. 男人四十一枝花,我花开后百花杀!Orz..繁忙的工作之余,joke一下~~

热门文章

  1. 分享107个竞聘述职PPT模板,总有一款适合您
  2. win7虚拟机永恒之蓝漏洞复现
  3. 乐鑫(ESPRESSIF) ESP32 ESP-IDF设置环境变量出现“安全频道支持出错”问题的解决办法
  4. 欧拉计划(鱼C论坛)@20161111
  5. oracle 存储过程执行成功后 报: ORA-01722: 无效数字,问题排查
  6. 构造函数 和 析构函数 能否抛出异常
  7. 安卓手机后台Service自动转发短信
  8. 思科路由器 VTY访问设备之Telnet配置
  9. 有知道深圳艾奕康(以前叫茂尔盛)、新钶信息系统公司、梦网科技的吗?
  10. android 缺少模拟器,Android模拟器缺少硬件配置文件(示例代码)