公司新上了個頻道,須要我負責的幾個頻道提供接口,由於進度比較趕,就直接寫了web的 http 接口供同事訪問。php
後來訪問量愈來愈大,出現了不少問題,例如:由於是json傳遞數據,偶爾會出現亂碼的狀況.他們是在php文件中直接調用的接口,若是網絡狀況很差會出現頁面很慢的狀況。老闆說要解決掉這個問題。想了不少辦法,最後決定從網絡方面入手。決定採用RPC來避免http的請求。web
RPC的框架的話,php語言的話首選的固然是鳥哥的yar,支持並行等等,總之有不少優勢。json
首先查看了鳥哥的文章 Yar – 並行的RPC框架(Concurrent RPC framework) ,對Yar的基本原理有了一個認識,作了一個簡單的請求頁面,具體見鳥哥博客,沒問題,接下來就是對現有項目的改造了。api
原來有項目是用phpcms(沒有使用生成功能)和YII作的。由於phpcms相對而言要簡單的多,因此先從phpcms入手,來對框架進行改造,加入Yar的機制。數組
原來全部的外部接口所有是經過phpcms的api機制來實現的,因此先從入口文件入手,入口文件的代碼以下:
網絡
define(‘PHPCMS_PATH’, dirname(FILE).DIRECTORY_SEPARATOR);
include PHPCMS_PATH.’phpcms/base.php’;
$param = pc_base::load_sys_class(‘param’);
$op = isset($GET['op']) && trim($_GET['op']) ? trim($_GET['op']) : exit(‘Operation can not be empty’);
if (!preg_match(‘/([^a-z]+)/i’,$op) && file_exists(PHPCMS_PATH.’api/’.$op.’.php’)) {
include PHPCMS_PATH.’api/’.$op.’.php’;
} else {
exit(‘API handler does not exist’);
}
文件很是簡單,就是引入了base基本類,還有不少判斷,由於Yar的服務端最好不要有數組,因此須要對判斷等進行改造,取消全部的輸出,將必要的錯誤判斷以return的方法返回。幸運的是,api的入口文件並無初始化路由,因此就省去了好多操做,只須要對入口文件作一些簡單的修改就能夠了。框架
在api的入口文件上加這兩行來出事化yar的服務:測試
$server = new Yar_Server(new $op());
$server->handle();url
$op是初始化的類名,和鳥哥的那個例子中的server端的類名是一樣的效果,不一樣的是由於業務需求,須要根絕請求url的參數來初始化不一樣的類。達到咱們須要得效果。.net
剩下的就還剩下原來的api調用文件中的路由了。將路由去掉,能夠根據映射添加一些客戶端須要得方法,例如:方法列表等等。
而後在客戶端模擬其餘頻道的請求,代碼以下:
$client = new Yar_Client(「http://zjk.fh21.net/api.php?op=iask」);
$return = $client->get_sort_data();
var_dump($return);
能夠正常的獲取到結果,OK,改造完成,如今只須要讓別的頻道稍微改一下調用方式就能夠了。
ps:可能還有其餘的工做要作,例如:將原來一些方法名在根絕新的功能修改等等。
後來經過反覆測試發現,接口之間的交互能夠直接經過php的數組來進行,而不必用Json數據。由於咱們的頁面全是gbk的,因此節省了不少開發成本.
yar的基本原理就是這樣,最重要的是要把本身所用框架的基本邏輯搞清楚,只要把yar整合到本身的框架中,基本上就等因而成功了。
最後 感謝鳥哥寫出這麼牛掰的東西。