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

    Qt版本5.1.1 以HTTP操作为例 Qt中的HTTP操作都是异步的. 内部通过线程实现 创建线程的时机在QNetworkReplyHttpImplPrivate::postRequest() vo ...

  2. CSS拾遗+技巧集合

    1.实现尖角符号. 这是内联inline-block标签独有的特性. <!DOCTYPE html> <html lang="en"> <head&g ...

  3. PHP+ MongoDB

    环境: uname -v # SMP Debian -+deb7u2 php -v PHP -~dotdeb. (cli) (built: Jun ::) Copyright (c) - The PH ...

  4. SQLServer-镜像配置

    实验环境:三台服务器分别为主服务器,镜像服务器,见证服务器,都加入域sql.com 1. 分别在三台服务器上安装SQL 2008 R2,安装数据库引擎和管理工具两个组件即可. 2. 镜像前准备工作. ...

  5. IP地址,子网掩码,默认网关,路由,形象生动阐述

    自己的Linux虚拟机已经分配了固定的IP地址(使用无线路由,用的是192.168.1.XX网段),公司的无线网络分配的IP地址是(10.51.174.XX网段) 所以当自己的电脑拿到公司,还想使用桥 ...

  6. [改善Java代码]使用package-info类为包服务

    建议50: 使用package-info类为包服务 Java中有一个特殊的类:package-info类,它是专门为本包服务的,为什么说它特殊呢?主要体现在3个方面: (1)它不能随便被创建 在一般的 ...

  7. 【补】【FZU月赛】【20150515】【待续】

    A FZU-2054 水题,比较A,B双方的最大值即可. B FZU-2055 string,截取‘.’之前和之后然后和给出的文件夹名和拓展名比较就好了啊,不明白为什么那么多人错. 代码: #incl ...

  8. hdu 4604 动态规划

    思路:这题的感觉就是最长上升子序列的升级版.首先对于最长上升子序列要用n*log(n)的算法才行,这个复杂度的算法可以从hdu1025得到启发.然后就是什么情况下最优问题了.对于序列中某个数i,找出其 ...

  9. 【原创】 windows下开发软件推荐

    1. 数据库查看器工具 navicat.exe

  10. Servlet & JSP - UrlRewriteFilter

    重写 URL 的好处有很多: 静态化页面,有利于搜索引擎收录. 隐藏真实的 URL,提高安全性. 当网站的结构发生变化时,无需要求用户修改书签. UrlRewriteFilter 的简单应用 1. M ...