记录我工作学习生活中的点点滴滴......

Yar纯PHP客户端的实现
发布于 基础编程
2013-12-27 18:36:11
4912
1
鸟哥@laruence 的Yar相当的强大,与bigpipe结合后让我们首页的响应时间缩短了80%。
不过很遗憾,sae不支持yar,并且sae不能自己安装扩展。
为了在sae使用yar客户端的功能,所以就有了这篇文章。

通过抓包分析发现
使用yar_client调用的时候是通过http post请求数据到server端,然后server端进行解析处理在返回,然后客户端在解析返回的数据
所以这里可以分为三步
1、封装数据
2、post请求获取结果
3、解析返回数据

封装数据可以看相关c代码,这里给出php的实现
$struct = array(
  'i' => time(),
  'm' => $method,
  'p' => $params,
);
$body = str_pad('PHP', 8, chr(0)) . serialize($struct);
$transaction = sprintf('%08x', mt_rand());
$header = $transaction; //transaction id
$header .= sprintf('%04x', 0); //protocl version
$header .= '80DFEC60'; //magic_num, default is: 0x80DFEC60
$header .= sprintf('%08x', 0); //reserved
$header .= sprintf('%064x', 0); //reqeust from who
$header .= sprintf('%064x', 0); //request token, used for authentication
$header .= sprintf('%08x', strlen($body)); //request body len
$data = '';
for ($i = 0; $i < strlen($header); $i = $i + 2) $data .= chr(hexdec('0x' . $header[$i] . $header[$i + 1])); $data .= $body; return $data; 
2、post请求就简单多了 sae的fetchurl很容易实现,这里就不做描述
3、解析返回数据代码
这里数据是通过php封装的,所以解析代码如下
$ret = unserialize(substr($con, 82 + 8));
这三步合并到一起就可以实现yar_client的功能,
至于yar精华部分的并行化调用需要curl的curl_multi部分的函数了
完整代码已经放到了github上,https://github.com/pakey/yar/blob/master/tools/yar_simple_client.inc
调用示例:https://github.com/pakey/yar/blob/master/tools/yar_simple_client.php

看鸟哥@laruence 会不会给合并进去了

分享本文到:
除非特殊注明,本文版权归原作者所有,欢迎转载!转载请注明版权以及本文地址,谢谢。
转载保留版权:Pakey's BLog >>基础编程 >>Yar纯PHP客户端的实现
本文地址:http://www.pakey.net/blog/yar-php-client.html