yar框架的并行原理分析(libcurl+epoll)

本文介绍了YAR框架如何利用libcurl进行网络请求,并结合epoll实现异步并行调用。通过libcurl的Easy和Multi接口,配合epoll事件监听,实现了高效的并发处理。重点讨论了multi_socket与epoll的结合,以及在PHP扩展中的应用。

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值