yar是一个轻量级的php rpc框架。有意思的是它的并行,其实就是libcurl作为网络库提供http请求,然后用epoll做为事件监听来实现整个异步并行调用的。在此基础上,就是如何利用zend api来对整个逻辑的封装了。我们先抛开zend api,单独看看libcurl 结合 epoll 是如何来做到异步并行调用的。
先大致熟悉一下libcurl,官网http://curl.haxx.se/libcurl/c/libcurl.html。
1、Easy interface
如何发起一个curl调用?直接上码:
#include<stdio.h>
#include<curl/curl.h>
int main(int argc, char *argv[])
{
CURL *curl;
CURLcode res;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://google.com");
res = curl_easy_perform(curl);
if(res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
curl_easy_cleanup(curl);
}
curl_global_cleanup();
return 0;
}
大致3个步骤:
1)、curl_easy_init :获得curl的处理句柄。
2)、curl_easy_setopt :用来针对网络传输过程中的一些选项设置,比如访问的地址、超时、设置请求回调、数据回写变量等等,详情去查看官网。
3)、curl_easy_perform:执行curl请求。
到这里你可以知道,一个curl句柄就是一个请求,既然是网络请求,你肯定猜到libcurl都为每个curl句柄都维护一个socket fd。
可以看出这种调用方式的特点是最简单,同步调用,但也效率低下。
2、Multi interface
Multi interface是基于多个curl句柄来实现并发的,大致原理是把多个curl_easy_init 创建的curl加入一个stack里面,然后并行去执行stack里面的curl句柄,来达到并行的目的。
对于Multi interface,一般有两种使用方法,一种是curl_multi_perform 结合s