在项目开发的过程中有时候会涉及到对外提供接口供第三方程序调用或者是不同程序间需要相互通信,那么最通用的做法是用传统的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. 数据库字段类型中char和Varchar区别

    char和varchar区别 char类型:对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节,char存储定长数据很方便,char字段上的索引效率级高,比如定义char(10),那么不论你 ...

  2. 面试常考的常用数据结构与算法(zz)

    数据结构与算法,这个部分的内容其实是十分的庞大,要想都覆盖到不太容易.在校学习阶段我们可能需要对每种结构,每种算法都学习,但是找工作笔试或者面试的时候,要在很短的时间内考察一个人这方面的能力,把每种结 ...

  3. XML 之 与Json或String的相互转换

    1.XML与String的相互转换 [1] XML 转为 String //载入Xml文件 XmlDocument xdoc = new XmlDocument(); xdoc.Load(" ...

  4. C - Minimum Inversion Number

    Description The inversion number of a given number sequence a1, a2, ..., an is the number of pairs ( ...

  5. IE11下用forms身份验证的问题

    <authentication mode="Forms"> <forms name="weboa" loginUrl="login. ...

  6. Python mongoDB 的简单操作

    #!/usr/bin/env python # coding:utf-8 # Filename:mongodb.py from pymongo import MongoClient,ASCENDING ...

  7. 为Google Reader守夜。。。

    Google的阅读器快要关闭了... 立刻截图留恋呢,以后就没机会了. 唉,真是令人惋惜. 虽然我接触Google Reader还不到一年,但是我已经习惯当连上WiFi时马上更新一下手机上的gRead ...

  8. python django第二弹

    每天晚上应该就这样坐着,然后把每天的东西做个总结,或大或小,有的人可能愿意把自己的东西保留在草稿箱,想想我还是把他写出来吧,前几次我发现又遇到了之前遇到的简单的问题,翻看自己之前写的几篇小日记,可以很 ...

  9. [转]javascript js cookie的存储,获取和删除

    本文转自:http://www.jb51.net/article/13240.htm 使用方法: //1.存储Cookie //2.参数说明: 1.参数1:Cookie存储Name,参数2:Cooki ...

  10. Eclipse遇到Initializing Java Tooling解决办法

    可参考博客:http://liaojuncai.iteye.com/blog/1954113 打开Eclipse的时候莫名其妙的出现这个错误,进度条一直显示这个提示Initializing java ...