【小(xiǎo)編推薦】ThinkPHP3.2——RPC

2014-06-26 &nbs←↑p; |   發布者★✔λ:梁國(guó)芳   |&n₩≤ αbsp;  查看(kàn):33↓ 20次

Thinkphp

RPC(Remote Procedure Cal↑πl Protocol)——遠(yuπλ∏£ǎn)程過程調用(yòng)協議(yì),它是(sh→ ì)一(yī)種通(tōng)過網絡從(cóng)遠(yuǎn≥ )程計(jì)算(suàn)機(jī)程序上(shàng)請¥© ¶(qǐng)求服務,而不(bù)需要(yà ∞o)了(le)解底層網絡技(jì)術(shù)的(de)協議(yì)。∞¶≈RPC協議(yì)假定某些(xiē)傳輸協議(yì)的(de) 存在,如₹♦(rú)TCP或UDP,為(wèi)通(tōng)信程序之間(jiā§'n)攜帶信息數(shù)據。在OSI網絡通(tōng)信模型中,RPC跨越了(ש‌←le)傳輸層和(hé)應用(yòng)層。RPC使得(de)"™♦Ω開(kāi)發包括網絡分(fēn)布式多(duō)程序在內♦&≠α(nèi)的(de) 應用(yòng)程序更加容易。

RPC采用(yòng)客戶機(jī)/服務器(qì)模式。請&♥(qǐng)求程序就(jiù)是(shì)一(yī)個(gè)客戶機(jβεī),而服務提供程序就(jiù)是(shì)®π一(yī)個(gè)服務器(qì)。首先,→¥•客戶機(jī)調用(yòng)進程發送一(yī)個(gè)有(yǒu)π∞進程參數(shù)的(de)調用(yòng)信息到(dào)服務 進β≠∑$程,然後等待應答(dá)信息。在服務器('£≤&qì)端,進程保持睡(shuì)眠狀态直到(dào)調用(yòng)信σ♦♠息的(de)到(dào)達為(wèi)止。當一(yī)個(gè)∏σ₹≤調用(yòng)信息到(dào)達,服務器(qì)獲得(de)進程參數(sh✘×ù),計(jì)算(suàn)結果,發送答(dá)複信息,然後 等待下(xσ​±ià)一(yī)個(gè)調用(yòng)信息,最後,客戶端調用(yòng)σ±‍≈進程接收答(dá)複信息,獲得(de)進程結果,↕λ>φ然後調用(yòng)執行(xíng)繼續進行(xíng)。

ThinkPHP支持廣泛的(de)RPC協議(yì),包括PHPRPCλπ、HPRose、JsonRPC以及Yar。

PHPRPC支持

PHPRPC 是(shì)一(yī)個(g γè)輕型的(de)、安全的(de)、跨網際的(de)ε§、跨語言的(de)、跨平台的(de)、跨環境的(de)、跨域的(d¶÷​®e)、支持複雜(zá)對(duì)象傳輸的♥λ(de)、支持引用(yòng)參數(shù)傳遞的(d×₽§✘e)、支持內(nèi)容輸出重定向的(d↔¥≥e)、支持分(fēn)級錯(cuò)誤 處理(lǐ)的(de)"¶∏、支持會(huì)話(huà)的(de)、面向↕"服務的(de)高(gāo)性能(néng)遠(yuǎn)程≤¥過程調用(yòng)協議(yì)。目前該協議(yì)的(de)≥€λγ最新版本為(wèi) 3.0。詳細的(de)資料可(kě)以¥&±↓參考phprpc官網(http://www.phprpc.org/zh♣€α&_CN/)

ThinkPHP提供了(le)對(duì)PHPRpc的™ ®(de)服務端和(hé)客戶端調用(yòng)的(d♣δ₽e)支持(客戶端是(shì)跨平台跨語言的(de),可(kě)以支持任何語言​ 的(de)調用(yòng))。

服務器(qì)端的(de)實現(xiàn)非常簡單,你(nǐ)隻需要(yà£αo)把控制(zhì)器(qì)繼承Think\Controlσσ ↑ler\RpcController類即可(kě)。

例如(rú):

  1. namespace Home\Controller;
  2. use Think\Controller\RpcController;
  3. class ServerController extends RpcController{
  4. public function test1(){
  5. return 'test1';
  6. }
  7. public function test2(){
  8. return 'test2';
  9. }
  10. private function test3(){
  11. return 'test3';
  12. }
  13. protected function test4(){
  14. return 'test3';
  15. }
  16. }

這(zhè)樣,ServerController控制(zhì)器(¶"∞qì)就(jiù)變成了(le)一(yī)個(gè)PHPRpc服務端÷>®→,請(qǐng)求地(dì)址為(wèi):

  1. http://serverName/index.p≠♠≤¶hp/Home/Server

rpc客戶端可(kě)以調用(yòng)test1和(hé)test2方法。方法的(de)返回值可(kě)以支持數(s✔₩¥€hù)組等PHPRpc支持的(de)格式。

注意:如(rú)果設置了(le)不(bù)同的(de$<)URL模式的(de)話(huà),服務器(qì)端請(qǐ ™↑ng)求地(dì)址需要(yào)相(xδ✘λ↕iàng)應調整。

可(kě)以使用(yòng)allowMethodList屬性設置允許訪問(wèn)的(de)方法列表,例如(rú):

  1. namespace Home\Controller;
  2. use Think\Controller\RpcController;
  3. class ServerController extends RpcController{
  4. protected $allowMethodList = array('test1','test2');
  5. public function test1(){
  6. return 'test1';
  7. }
  8. public function test2(){
  9. return 'test2';
  10. }
  11. public function test3(){
  12. return 'test3';
  13. }
  14. }

上(shàng)面的(de)設置表示隻允許test1和(hé)test2方法被rpc客戶端調用(yòng)。

你(nǐ)可(kě)以采用(yòng)多(duō)個(gè)控制(zhì↕γ≥λ)器(qì)進行(xíng)不(bù)同↓≈的(de)PHPRpc Server端用( ♦↓♣yòng)于不(bù)同的(de)需要(yào)。

如(rú)果要(yào)在ThinkPHP裡(lǐ)面進行(xíng‍ )客戶端調用(yòng),可(kě)以使用(>ε§yòng)下(xià)面的(de)代碼:

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. class IndexController extends Controller {
  4. public function index(){
  5. Vendor('phpRPC.phprpc_clien$™©t');
  6. $client = new \PHPRPC_Client('http://serverName/index.php/Home/Serveφ"εr');
  7. // 或者采用(yòng)
  8. //$client = new \PHPRPC_Client()β♦☆↕;
  9. //$client->useSer≥✘vice('http://serverName/inde↑§x.php/Home/Server');
  10. $result = $client->test1();
  11. }
  12. }

其中test1就(jiù)是(shì)服務器(qì)端定義 ∏₩的(de)方法。其他(tā)使用(yòng)和(hé)PHP的(de)方法調用™¥σ≤(yòng)一(yī)緻。

Hprose支持

Hprose (High Performance Remote  σ Object Service Engine) 是(sπ₽$ hì)一(yī)個(gè)MIT開(kāi)源許可(kě)∏↑®的(de)新型輕量級跨語言跨平台的(de)面 ¶∞向對(duì)象的(de)高(gāo)性能(néng)遠(y§↓‌uǎn)程動态通(tōng)訊中間(jiān)件(jiàn)。它>₩™✘支持衆多(duō)語言,例如(rú)nodeJs, C++♥"÷, .NET, Java, Delphi, Objective-§δC, ActionScript, JavaScript, ASP,★£☆∏ PHP, Python, Ruby, Perl  α♦等語言,通(tōng)過 Hprose 可ε↔☆®(kě)以在這(zhè)些(xiē)語言之間(jiān)實現(λ>δxiàn)方便且高(gāo)效的(de)¥♦互通(tōng)。

你(nǐ)可(kě)以認為(wèi)它是(shì) PHPRPC↓≠​ 的(de)商業(yè)版本,但(dàn✘∑∑)是(shì)它跟 PHPRPC 完全不(bù)同,hprose 協議β‍​π(yì)是(shì)全新設計(jì)的(de),比 PHPRPC 更πλ加高(gāo)效,實現(xiàn)也(yě)完全是(shì)全部§¥從(cóng)頭開(kāi)始的(de),£α★♣比 PHPRPC 更加易用(yòng)。更多(duō)信息可(kě)♠∑以參考(http://www.hprose.com/)

ThinkPHP同樣也(yě)提供了(le)對(duì)Hprose的(de γ<)服務端和(hé)客戶端調用(yòng)的(de)®£$σ支持。

服務器(qì)端的(de)使用(yòng)和(hé)PHP♠$>∞RPC的(de)區(qū)别隻是(shì)把控‌±‌制(zhì)器(qì)繼承Think\Controll↔α♥er\HproseController類即可(kě),其他(tāελ¶∞)用(yòng)法基本一(yī)緻,例如(rú):

  1. namespace Home\Controller;
  2. use Think\Controller\HproseContr<​☆✔oller;
  3. class ServerController extends HproseController{
  4. public function test1(){
  5. return 'test1';
  6. }
  7. public function test2(){
  8. return 'test2';
  9. }
  10. }

我們可(kě)以進行(xíng)一(yī)些(xiē)hpros↕↕©↔e服務器(qì)端的(de)參數(shù)設置,包∏π括debug、crossDomain、P3P和(hé)get,設置方法♣•如(rú)下(xià):

  1. namespace Home\Controller;
  2. use Think\Controller\HproseContr♠σ↕oller;
  3. class ServerController extends HproseController{
  4. protected $crossDomain = true;
  5. protected $P3P = true;
  6. protected $get = true;
  7. protected $debug = true;
  8.  
  9. public function test1(){
  10. return 'test1';
  11. }
  12. public function test2(){
  13. return 'test2';
  14. }
  15. }

采用(yòng)ThinkPHP的(de)Hprose的(d"✔♣∑e)客戶端調用(yòng)示例如(rú)下(xià):

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. class IndexController extends Controller {
  4. public function index(){
  5. vendor('Hprose.HproseHttpClient');
  6. $client = new \HproseHttpClient('http://serverName/i<≈ndex.php/Home/Server');
  7. // 或者采用(yòng)
  8. //$client = new \HproseHttpCl☆​÷ient();
  9. //$client->useService('http:/ε¥¥₩/serverName/index.php/Home/Serv↔★er');
  10. $result = $client->test1();
  11. }
  12. }

JsonRPC支持

json-rpc是(shì)基于json的(de)跨語言遠(y≈©uǎn)程調用(yòng)協議(yì),比xml-rpc≤↕Ω、webservice等基于文(wén)本的(de)協議(yì)傳輸↔♠β•數(shù)據格小(xiǎo);相(xiàng)對(duì)he¶λ<∏ssian、java-rpc等二進制(zhì)協議(yì ¶Ω)便于調試、實現(xiàn)、擴展,是(shì)非常→‌優秀的(de)一(yī)種遠(yuǎn)程調用(yòng)協議(yì)。

ThinkPHP3.2提供了(le)對(duβ♥₽ì)JsonRPC的(de)服務器(qì)端和★Ω✘★(hé)客戶端調用(yòng)支持,服務器(qì)端實  ↕✘現(xiàn)示例:

  1. namespace Home\Controller;
  2. use Think\Controller\JsonRpcCont‍☆∏§roller;
  3. class ServerController extends JsonRpcController {
  4. public function index(){
  5. return 'Hello, JsonRPC!';
  6. }
  7. // 支持參數(shù)傳入
  8. public function test($name=''){
  9. return "Hello, {$name}!&∑π∞✘quot;;
  10. }
  11. }

所有(yǒu)的(de)public方法都(dōu)可(kě)以用(yò ↓'÷ng)于遠(yuǎn)程調用(yòng),客戶§"端調用(yòng)方式如(rú)下(xià):

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. class IndexController extends Controller {
  4. public function index(){
  5. vendor('jsonRPC.jsonRPCClient');
  6. $client = new \jsonRPCClient('http://serverName/index.phα‍☆✔p/Home/Server');
  7. $result = $client->index();
  8. var_dump($result); // 結果:Hello, JsonRPC!
  9. $result = $client->test('ThinkPHP');
  10. var_dump($result); // 結果:Hello, ThinkPHP!
  11. }
  12. }

Yar支持

Yar (yet another RPC ₽ו∑framework) 是(shì)一(yī)個(gè)PHP擴展的(de)RP✘∞$C框架, 和(hé)現(xiàn)有(yǒu↕<¶↕)的(de)RPC框架(xml-rpc,  ¶>✘ soap)不(bù)同, 這(zhè)是$₩<'(shì)一(yī)個(gè)輕量級的(de)框架, 支持多(→λαduō)種打包協議(yì)(msgpack, json, php),→← 并且最重要(yào)的(de)一(yī)個(gè)特點是(sh♦γ♣​ì), 它是(shì)可(kě)并行(xíng)化(huà)的(de)。

要(yào)使用(yòng)Yar支持首先需要(yào)安裝Yar擴展,✘ δ擴展下(xià)載地(dì)址: http:•"ε//pecl.php.net/packa€≈✔¶ge/yar

Yar說(shuō)明(míng)文(wén)檔: h"αttp://hk2.php.net/manual/zh♦λ/book.yar.php

安裝好(hǎo)擴展後,使用(yòng)T' ±hinkPHP就(jiù)可(kě)以開(•™γkāi)發服務器(qì)端,示例如(rú)下(xià):

  1. namespace Home\Controller;
  2. use Think\Controller\YarController;
  3. class ServerController extends YarController {
  4. public function index(){
  5. return 'Hello, Yar RPC!';
  6. }
  7. public function hello($name=''){
  8. return 'Hello, {$name}!';
  9. }
  10. }

Yar除了(le)并行(xíng),還(háiΩ§)有(yǒu)一(yī)個(gè)亮(liàng)¥€₹點,通(tōng)過GET方式可(kě)以查看(kα≈•'àn)到(dào)接口列表及注釋。

客戶端調用(yòng)示例如(rú)下(xià):

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. class IndexController extends Controller {
  4. public function index(){
  5. $client = new \Yar_client('http://serverName/index.php/Home/Se∑'♠>rver');
  6. $result = $client->index();
  7. var_dump($result); // 結果:Hello, Yar!
  8. }
  9. }