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