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