Yar:yet another rpc,这是它的全称。
关于一些基本介绍 http://www.laruence.com/2012/09/15/2779.html 可以去 鸟哥的博客去了解下。
我也简单介绍下用法,下面的代码来自鸟哥的博客。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
实例化 Yar_server的时候,需要传递一个对象,然后会将我们提交的参数作为 这个对象的method来使用,其实这个做法就相当于是一个
简单的路由功能,它巧妙将 doc作为api的接口说明来使用,让我们get直接访问server.php的时候,看到的会是下面的页面:
整体来讲,yar分为两部分:server和client.
Server端:
上面有讲到server可以理解为一个简单的路由,它只是将我们的对象作为一种服务接口来使用,
它的主要流程如下:
实例化Yar_Server时,传递一个自定义API对象,将这个对象保留在 属性 _executor中,调用handle方法,
如果不是post请求,则只输出接口说明;
如果是post请求,接收api函数,读取post数据,检测 API对象中是否存在此方法,
如果存在就call_user_function_ex来执行此方法,如果不存在bailout。
看下代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
|
关键部分已经加了注释,代码写的也通俗易懂。
那现在看Client了:
我之前做的其实就相当于这个client,没有server端,只是用libcurl+epoll的事件模式去curl我们的接口,有数据返回时,执行
callback函数,看了yar代码之后,发现 ,思路其实很相似。
使用方法 :
1 2 3 4 5 6 7 8 9 10 11 |
|
Yar_Concurrent_Client::call方法接收四个参数,
第一个是访问的接口地址,
第二个是需要执行的方法,
第三个是传递的参数,
第四个就是回调函数。
还有第五个参数,一个数组,它用来设置options,默认为空。
这些所有信息保存在 _callstack属性中。
由Yar_Concurrent_Client::loop()统一发送 接收epoll事件,当发现有一个读事件时,读到所有数据然后调用callback。
在扩展实现中有一个数据结构:
1 2 3 4 5 6 7 8 9 10 11 |
|
他保存所有call设置的参数,在执行loop时,会从这里拿这些信息,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
|
client关键的地方在php_yar_concurrent_client_handle函数中:
在这之前,有几个比较重要的数据结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
|
上面的函数指针代码量比较大,我就不贴代码了。
下面看 php_yar_concurrent_client_handle喊。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
|
在执行multi->exec 时,如果所有数据已经读取成功,就会调用 php_yar_concurrent_client_callback函数,它也是执行 call_user_function_ex的地方,这样我们设置的callback函数也就执行成功了。
Client 看代码的过程比较绕,原因就是上面的几个结构,
yar_transport_t;
yar_transport_multi_t;
yar_transport_multi_interface_t;
yar_transport_interface_t;
关键的是yar_transport_multi_t和yar_transport_interface_t,
我们要并行几个接口,创建几个 yar_transport_interface_t结构,它保存了curl_easy句柄,
yar_transport_interface_t 创建完成后,调用 yar_transport_multi_t->php_yar_curl_multi_add_handle函数,将
yar_transport_interface_t 指针添加到yar_curl_multi_data_t->chs中,所有的curl句柄添加完后执行
yar_transport_multi_t->php_yar_curl_multi_exec,执行epoll事件模型,所有数据读取结束后 调用
yar_concurrent_client_callback执行我们传递的callback函数,就是这样。