公司新上了个频道,须要我负责的几个频道提供接口,由于进度比较赶,就直接写了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整合到本身的框架中,基本上就等因而成功了。
最后 感谢鸟哥写出这么牛掰的东西。