在项目开发的过程中有时候会涉及到对外提供接口供第三方程序调用或者是不同程序间需要相互通信,那么最通用的做法是用传统的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 ,代码如下:

<?php

Yii::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中做一个小小的改动:

<?php

Yii::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有所变化而已。

Yii框架中集成phprpc、hprose的更多相关文章

  1. 浅析Thinkphp框架中运用phprpc扩展模式

    浅析Thinkphp框架中应用phprpc扩展模式 这次的项目舍弃了原来使用Axis2做web服务端的 方案,改用phprpc实现,其一是服务端的thinkphp已集成有该模式接口,其二是phprpc ...

  2. Yii 框架中安装 memcache 及配置和测试

    安装php_memcache.dll扩展 1.首先将php_memcache.dll文件放入E:\server\php\ext目录下 (php_memcache.dll下载地址:http://wind ...

  3. 使用Yii框架中遇到的三个问题

    以下由我们在信易网络公司开发项目的时候终结出的一些经验 使用Yii框架中遇到的三个问题 1.main.php文件中欲引入全局变量的问题 还原一下此问题:在Yii框架中,main.php一般会作为整个应 ...

  4. yii框架中关于控制器中filter过滤器和外部action的使用

    在yii框架中,控制器的过滤器分为执行前和执行后,这里举例是在执行控制器前的过滤. 需要在components/文件夹下定义公共的TestAction.php文件,并且实现run()方法.这个acti ...

  5. 细说shiro之五:在spring框架中集成shiro

    官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <gr ...

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

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

  7. YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因

    YII框架中可以使用foreach遍历对象以及可以使用数组形式直接访问对象的原因在YII框架的使用过程中,我们可以使用foreach直接遍历findAll等方法返回的对象的属性为什么呢?其实这与CMo ...

  8. springboot框架中集成thymeleaf引擎,使用form表单提交数据,debug结果后台获取不到数据

    springboot框架中集成thymeleaf引擎,使用form表单提交数据,debug结果后台获取不到数据 表单html: <form class="form-horizontal ...

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

    最近在研究PHP的Yii框架,很喜欢,碰到导出Excel的问题,研究了一下,就有了下面的方法: 1.首先在config\main.php中添加对PHPExcel的引用,我的方式是这样: 1 2 3 4 ...

随机推荐

  1. #pragma_pack(n)_与___attribute(aligned(n))

    #pragma pack(n) 与 __attribute(aligned(n))   在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int.long.float等)的变量,也 ...

  2. iOS开发:获取设备IP地址

    一.导入头文件 //首先导入头文件信息 #include <ifaddrs.h> #include <arpa/inet.h> #include <net/if.h> ...

  3. oracle checkpoint 详解

    Oracle checkpoint详解 topcheckpoint扫盲 top什么是checkpoint 在数据库系统中,写日志和写数据文件是数据库中IO消耗最大的两种操作,在这两种操作中写数据文件属 ...

  4. 关于Excle中的VLookUp的函数的使用

    VLookUp函数的使用,VLookUp中的V是垂直的(vertical)意思,此外与此相类似的函数还有HLOOKUP(Horizonal水平的)意思. 下面主要谈谈VLookUp的使用方法. VLo ...

  5. UseAdaptiveSizePolicy与CMS垃圾回收同时使用导致的JVM报错

    系统在灰度环境上变更时发现JVM启动报错,详细检查JVM配置参数,发现新境了如下配置: -XX:+UseAdaptiveSizePolicy和-XX:+UseConcMarkSweepGC 初步猜想是 ...

  6. saltstack实战3--配置管理之YAML语法

    本文来自如下链接http://docs.saltstack.cn/topics/yaml/index.html 了解YAML 默认的SLS文件的renderer是YAML renderer.YAML是 ...

  7. 核心概念 —— 服务提供者

    1.简介 服务提供者是Laravel应用启动的中心,你自己的应用以及所有Laravel的核心服务都是通过服务提供者启动. 但是,我们所谓的"启动"指的是什么?通常,这意味着注册事物 ...

  8. Git - Eclipse 提交工程至 GitHub

    1. 在 GitHub 新建一个工程 hello-world,repository 地址是 https://github.com/username/hello-world.git 2. 在 Eclip ...

  9. 转 Android中this、super的区别

    在Java中,this通常指当前对象,super则指父类的.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目 的,当然,this的另一个用 ...

  10. Entity Framework 6.1-Database First介绍

    原文:Entity Framework 6.1-Database First介绍 这种方式是比较传统的以数据库为核心的开发模式.比较适合有数据库DBA的团队.或者数据库已存在的情况. 优缺点: 1.优 ...