
2014-06-26 &nbs←↑p; | 發布者★✔λ:梁國(guó)芳 |&n₩≤ αbsp; 查看(kàn):33↓ 20次
ThinkphpRPC(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 是(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ú):
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';}}
這(zhè)樣,ServerController控制(zhì)器(¶"∞qì)就(jiù)變成了(le)一(yī)個(gè)PHPRpc服務端÷>®→,請(qǐng)求地(dì)址為(wèi):
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ú):
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à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)代碼:
namespace Home\Controller;use Think\Controller;class IndexController extends Controller {public function index(){Vendor('phpRPC.phprpc_clien$™©t');$client = new \PHPRPC_Client('http://serverName/index.php/Home/Serveφ"εr');// 或者采用(yòng)//$client = new \PHPRPC_Client()β♦☆↕;//$client->useSer≥✘vice('http://serverName/inde↑§x.php/Home/Server');$result = $client->test1();}}
其中test1就(jiù)是(shì)服務器(qì)端定義 ∏₩的(de)方法。其他(tā)使用(yòng)和(hé)PHP的(de)方法調用™¥σ≤(yòng)一(yī)緻。
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ú):
namespace Home\Controller;use Think\Controller\HproseContr<☆✔oller;class ServerController extends HproseController{public function test1(){return 'test1';}public function test2(){return 'test2';}}
我們可(kě)以進行(xíng)一(yī)些(xiē)hpros↕↕©↔e服務器(qì)端的(de)參數(shù)設置,包∏π括debug、crossDomain、P3P和(hé)get,設置方法♣•如(rú)下(xià):
namespace Home\Controller;use Think\Controller\HproseContr♠σ↕oller;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';}}
采用(yòng)ThinkPHP的(de)Hprose的(d"✔♣∑e)客戶端調用(yòng)示例如(rú)下(xià):
namespace Home\Controller;use Think\Controller;class IndexController extends Controller {public function index(){vendor('Hprose.HproseHttpClient');$client = new \HproseHttpClient('http://serverName/i<≈ndex.php/Home/Server');// 或者采用(yòng)//$client = new \HproseHttpCl☆÷ient();//$client->useService('http:/ε¥¥₩/serverName/index.php/Home/Serv↔★er');$result = $client->test1();}}
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)示例:
namespace Home\Controller;use Think\Controller\JsonRpcCont☆∏§roller;class ServerController extends JsonRpcController {public function index(){return 'Hello, JsonRPC!';}// 支持參數(shù)傳入public function test($name=''){return "Hello, {$name}!&∑π∞✘quot;;}}
所有(yǒu)的(de)public方法都(dōu)可(kě)以用(yò ↓'÷ng)于遠(yuǎn)程調用(yòng),客戶§"端調用(yòng)方式如(rú)下(xià):
namespace Home\Controller;use Think\Controller;class IndexController extends Controller {public function index(){vendor('jsonRPC.jsonRPCClient');$client = new \jsonRPCClient('http://serverName/index.phα☆✔p/Home/Server');$result = $client->index();var_dump($result); // 結果:Hello, JsonRPC!$result = $client->test('ThinkPHP');var_dump($result); // 結果:Hello, ThinkPHP!}}
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à):
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除了(le)并行(xíng),還(háiΩ§)有(yǒu)一(yī)個(gè)亮(liàng)¥€₹點,通(tōng)過GET方式可(kě)以查看(kα≈•'àn)到(dào)接口列表及注釋。
客戶端調用(yòng)示例如(rú)下(xià):
namespace Home\Controller;use Think\Controller;class IndexController extends Controller {public function index(){$client = new \Yar_client('http://serverName/index.php/Home/Se∑'♠>rver');$result = $client->index();var_dump($result); // 結果:Hello, Yar!}}
