在項目開發的過程中有時候會涉及到對外提供接口供第三方程序調用或者是不同程序間需要相互通信,那么最通用的做法是用傳統的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有所變化而已。