# RPC
[上一頁](# "上一頁")[下一頁](# "下一頁")
**RPC**(Remote Procedure Call Protocol)遠程過程調用協議,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。在OSI網絡通信模型中,RPC跨越了傳輸層和應用層。RPC使得開發包括網絡分布式多程序在內的應用程序更加容易。
RPC采用客戶機/服務器模式。請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然后等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息的到達為止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答復信息,然后等待下一個調用信息,最后,客戶端調用進程接收答復信息,獲得進程結果,然后調用執行繼續進行。
ThinkPHP支持廣泛的RPC協議,包括PHPRPC、HPRose、JsonRPC以及Yar。
### PHPRPC支持
PHPRPC 是一個輕型的、安全的、跨網際的、跨語言的、跨平臺的、跨環境的、跨域的、支持復雜對象傳輸的、支持引用參數傳遞的、支持內容輸出重定向的、支持分級錯誤處理的、支持會話的、面向服務的高性能遠程過程調用協議。目前該協議的最新版本為 3.0。詳細的資料可以參考phprpc官網( [http://www.phprpc.org/zh_CN/](http://www.phprpc.org/zh_CN/))
ThinkPHP提供了對PHPRpc的服務端和客戶端調用的支持(客戶端是跨平臺跨語言的,可以支持任何語言的調用)。
服務器端的實現非常簡單,你只需要把控制器繼承Think\Controller\RpcController類即可。
例如:
~~~
namespace Home\Controller;
use Think\Controller\RpcController;
class ServerController extends RpcController{
public function test1(){
return 'test1';
}
public function test2(){
return 'test2';
}
private function test3(){
return 'test3';
}
protected function test4(){
return 'test3';
}
}
~~~
這樣,ServerController控制器就變成了一個PHPRpc服務端,請求地址為:
~~~
http://serverName/index.php/Home/Server
~~~
rpc客戶端可以調用`test1`和`test2`方法。方法的返回值可以支持數組等PHPRpc支持的格式。
> 注意:如果設置了不同的URL模式的話,服務器端請求地址需要相應調整。
可以使用**allowMethodList**屬性設置允許訪問的方法列表,例如:
~~~
namespace Home\Controller;
use Think\Controller\RpcController;
class ServerController extends RpcController{
protected $allowMethodList = array('test1','test2');
public function test1(){
return 'test1';
}
public function test2(){
return 'test2';
}
public function test3(){
return 'test3';
}
}
~~~
上面的設置表示只允許`test1`和`test2`方法被rpc客戶端調用。
> 你可以采用多個控制器進行不同的PHPRpc Server端用于不同的需要。
如果要在ThinkPHP里面進行客戶端調用,可以使用下面的代碼:
~~~
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function index(){
Vendor('phpRPC.phprpc_client');
$client = new \PHPRPC_Client('http://serverName/index.php/Home/Server');
// 或者采用
//$client = new \PHPRPC_Client();
//$client->useService('http://serverName/index.php/Home/Server');
$result = $client->test1();
}
}
~~~
其中test1就是服務器端定義的方法。其他使用和PHP的方法調用一致。
### Hprose支持
**Hprose** (High Performance Remote Object Service Engine) 是一個MIT開源許可的新型輕量級跨語言跨平臺的面向對象的高性能遠程動態通訊中間件。它支持眾多語言,例如nodeJs, C++, .NET, Java, Delphi, Objective-C, ActionScript, JavaScript, ASP, PHP, Python, Ruby, Perl 等語言,通過 Hprose 可以在這些語言之間實現方便且高效的互通。
你可以認為它是 PHPRPC 的商業版本,但是它跟 PHPRPC 完全不同,hprose 協議是全新設計的,比 PHPRPC 更加高效,實現也完全是全部從頭開始的,比 PHPRPC 更加易用。更多信息可以參考([http://www.hprose.com/](http://www.hprose.com/))
ThinkPHP同樣也提供了對Hprose的服務端和客戶端調用的支持。
服務器端的使用和PHPRPC的區別只是把控制器繼承Think\Controller\HproseController類即可,其他用法基本一致,例如:
~~~
namespace Home\Controller;
use Think\Controller\HproseController;
class ServerController extends HproseController{
public function test1(){
return 'test1';
}
public function test2(){
return 'test2';
}
}
~~~
我們可以進行一些hprose服務器端的參數設置,包括debug、crossDomain、P3P和get,設置方法如下:
~~~
namespace Home\Controller;
use Think\Controller\HproseController;
class ServerController extends HproseController{
protected $crossDomain = true;
protected $P3P = true;
protected $get = true;
protected $debug = true;
public function test1(){
return 'test1';
}
public function test2(){
return 'test2';
}
}
~~~
采用ThinkPHP的Hprose的客戶端調用示例如下:
~~~
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function index(){
vendor('Hprose.HproseHttpClient');
$client = new \HproseHttpClient('http://serverName/index.php/Home/Server');
// 或者采用
//$client = new \HproseHttpClient();
//$client->useService('http://serverName/index.php/Home/Server');
$result = $client->test1();
}
}
~~~
### JsonRPC支持
json-rpc是基于json的跨語言遠程調用協議,比xml-rpc、webservice等基于文本的協議傳輸數據格小;相對hessian、java-rpc等二進制協議便于調試、實現、擴展,是非常優秀的一種遠程調用協議。
ThinkPHP3.2提供了對JsonRPC的服務器端和客戶端調用支持,服務器端實現示例:
~~~
namespace Home\Controller;
use Think\Controller\JsonRpcController;
class ServerController extends JsonRpcController {
public function index(){
return 'Hello, JsonRPC!';
}
// 支持參數傳入
public function test($name=''){
return "Hello, {$name}!";
}
}
~~~
所有的public方法都可以用于遠程調用,客戶端調用方式如下:
~~~
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function index(){
vendor('jsonRPC.jsonRPCClient');
$client = new \jsonRPCClient('http://serverName/index.php/Home/Server');
$result = $client->index();
var_dump($result); // 結果:Hello, JsonRPC!
$result = $client->test('ThinkPHP');
var_dump($result); // 結果:Hello, ThinkPHP!
}
}
~~~
### Yar支持
Yar (yet another RPC framework) 是一個PHP擴展的RPC框架, 和現有的RPC框架(xml-rpc, soap)不同, 這是一個輕量級的框架, 支持多種打包協議(msgpack, json, php), 并且最重要的一個特點是, 它是可并行化的。
要使用Yar支持首先需要安裝Yar擴展,擴展下載地址:[http://pecl.php.net/package/yar](http://pecl.php.net/package/yar)
Yar說明文檔:[http://hk2.php.net/manual/zh/book.yar.php](http://hk2.php.net/manual/zh/book.yar.php)
安裝好擴展后,使用ThinkPHP就可以開發服務器端,示例如下:
~~~
namespace Home\Controller;
use Think\Controller\YarController;
class ServerController extends YarController {
public function index(){
return 'Hello, Yar RPC!';
}
public function hello($name=''){
return 'Hello, {$name}!';
}
}
~~~
> Yar除了并行,還有一個亮點,通過GET方式可以查看到接口列表及注釋。
客戶端調用示例如下:
~~~
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller {
public function index(){
$client = new \Yar_client('http://serverName/index.php/Home/Server');
$result = $client->index();
var_dump($result); // 結果:Hello, Yar!
}
}
~~~
[上一頁](# "上一頁")[下一頁](# "下一頁")
- 序言
- 基礎
- 獲取ThinkPHP
- 環境要求
- 目錄結構
- 入口文件
- 自動生成
- 模塊
- 控制器
- 開發規范
- 配置
- 配置格式
- 配置加載
- 讀取配置
- 動態配置
- 擴展配置
- 批量配置
- 架構
- 模塊化設計
- URL模式
- 多層MVC
- CBD模式
- 命名空間
- 自動加載
- 應用模式
- 項目編譯
- 系統流程
- 路由
- 路由定義
- 規則路由
- 正則路由
- 靜態路由
- 閉包支持
- 實例說明
- 控制器
- 控制器定義
- 前置和后置操作
- Action參數綁定
- 偽靜態
- URL大小寫
- URL生成
- AJAX返回
- 跳轉和重定向
- 輸入變量
- 請求類型
- 空操作
- 空控制器
- 操作綁定到類
- 模型
- 模型定義
- 模型實例化
- 字段定義
- 連接數據庫
- 切換數據庫
- 分布式數據庫支持
- 連貫操作
- WHERE
- TABLE
- ALIAS
- DATA
- FIELD
- ORDER
- LIMIT
- PAGE
- GROUP
- HAVING
- JOIN
- UNION
- DISTINCT
- LOCK
- CACHE
- COMMENT
- RELATION
- 命名范圍
- CURD操作
- 數據創建
- 數據寫入
- 數據讀取
- 數據更新
- 數據刪除
- ActiveRecord
- 字段映射
- 查詢語言
- 查詢方式
- 表達式查詢
- 快捷查詢
- 區間查詢
- 組合查詢
- 統計查詢
- SQL查詢
- 動態查詢
- 子查詢
- 自動驗證
- 自動完成
- 參數綁定
- 虛擬模型
- 模型分層
- 視圖模型
- 關聯模型
- 高級模型
- Mongo模型
- 視圖
- 模板定義
- 模板主題
- 模板賦值
- 模板渲染
- 獲取模板地址
- 獲取內容
- 模板引擎
- 模板
- 變量輸出
- 系統變量
- 使用函數
- 默認值輸出
- 使用運算符
- 標簽庫
- 模板繼承
- 修改定界符
- 三元運算
- 包含文件
- 內置標簽
- Volist標簽
- Foreach標簽
- For標簽
- Switch標簽
- 比較標簽
- 范圍判斷標簽
- IF標簽
- Present標簽
- Empty標簽
- Defined標簽
- Assign標簽
- Define標簽
- 標簽嵌套
- import標簽
- 使用PHP代碼
- 原樣輸出
- 模板注釋
- 模板布局
- 模板替換
- 調試
- 調試模式
- 異常處理
- 日志記錄
- 頁面Trace
- Trace方法
- 變量調試
- 性能調試
- 錯誤調試
- 模型調試
- 緩存
- 數據緩存
- 快速緩存
- 查詢緩存
- SQL解析緩存
- 靜態緩存
- 安全
- 輸入過濾
- 表單合法性檢測
- 表單令牌
- 防止SQL注入
- 目錄安全文件
- 保護模板文件
- 上傳安全
- 防止XSS攻擊
- 其他安全建議
- 擴展
- 類庫擴展
- 驅動擴展
- 緩存驅動
- 數據庫驅動
- 日志驅動
- Session驅動
- 存儲驅動
- 模板引擎驅動
- 標簽庫驅動
- 行為擴展
- 標簽擴展
- Widget擴展
- 應用模式
- 部署
- PATH_INFO支持
- URL重寫
- 模塊部署
- 域名部署
- 入口綁定
- 替換入口
- 專題
- SESSION支持
- Cookie支持
- 多語言支持
- 數據分頁
- 文件上傳
- 驗證碼
- 圖像處理
- RESTFul
- RPC
- SAE
- IP獲取和定位
- 附錄
- 常量參考
- 配置參考
- 升級指導
- 更新日志
- 鳴謝
- 關于