phpcms 里面 Yar 的使用

670 查看

公司新上了个频道,需要我负责的几个频道提供接口,因为进度比较赶,就直接写了web的 http 接口供同事访问。

后来访问量越来越大,出现了很多问题,例如:因为是json传递数据,偶尔会出现乱码的情况.他们是在php文件中直接调用的接口,如果网络情况不好会出现页面很慢的情况。老板说要解决掉这个问题。想了很多办法,最后决定从网络方面入手。决定采用RPC来避免http的请求。

RPC的框架的话,php语言的话首选的当然是鸟哥的yar,支持并行等等,总之有很多优点。

首先查看了鸟哥的文章 Yar – 并行的RPC框架(Concurrent RPC framework) ,对Yar的基本原理有了一个认识,做了一个简单的请求页面,具体见鸟哥博客,没问题,接下来就是对现有项目的改造了。

原来有项目是用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();

$op是初始化的类名,和鸟哥的那个例子中的server端的类名是同样的效果,不同的是因为业务需求,需要根绝请求url的参数来初始化不同的类。达到我们需要得效果。

剩下的就还剩下原来的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整合到自己的框架中,基本上就等于是成功了。

最后 感谢鸟哥写出这么牛掰的东西。