本文将探讨两种具体的实现方法, 并对不同的方法做简单的性能对比.
1. 经典cURL并发机制及其存在的问题
经典的cURL实现机制在网上很容易找到, 比如参考PHP在线手册的如下实现方式:
复制代码 代码如下:
function classic_curl($urls, $delay) {
$queue = curl_multi_init();
$map = array();
foreach ($urls as $url) {
// create cURL resources
$ch = curl_init();
// set URL and other appropriate options
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOSIGNAL, true);
// add handle
curl_multi_add_handle($queue, $ch);
$map[$url] = $ch;
}
$active = null;
// execute the handles
do {
$mrc = curl_multi_exec($queue, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active > 0 && $mrc == CURLM_OK) {
if (curl_multi_select($queue, 0.5) != -1) {
do {
$mrc = curl_multi_exec($queue, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
}
$responses = array();
foreach ($map as $url=>$ch) {
$responses[$url] = callback(curl_multi_getcontent($ch), $delay);
curl_multi_remove_handle($queue, $ch);
curl_close($ch);
}
curl_multi_close($queue);
return $responses;
}
首先将所有的URL压入并发队列, 然后执行并发过程, 等待所有请求接收完之后进行数据的解析等后续处理. 在实际的处理过程中, 受网络传输的影响, 部分URL的内容会优先于其他URL返回, 但是经典cURL并发必须等待最慢的那个URL返回之后才开始处理, 等待也就意味着CPU的空闲和浪费. 如果URL队列很短, 这种空闲和浪费还处在可接受的范围, 但如果队列很长, 这种等待和浪费将变得不可接受.
2. 改进的Rolling cURL并发方式 仔细分析不难发现经典cURL并发还存在优化的空间, 优化的方式时当某个URL请求完毕之后尽可能快的去处理它, 边处理边等待其他的URL返回, 而不是等待那个最慢的接口返回之后才开始处理等工作, 从而避免CPU的空闲和浪费. 闲话不多说, 下面贴上具体的实现:
复制代码 代码如下:
function rolling_curl($urls, $delay) {
$queue = curl_multi_init();
$map = array();
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOSIGNAL, true);
curl_multi_add_handle($queue, $ch);
$map[(string) $ch] = $url;
}
$responses = array();
do {
while (($code = curl_multi_exec($queue, $active)) == CURLM_CALL_MULTI_PERFORM) ;
if ($code != CURLM_OK) { break; }
// a request was just completed -- find out which one
while ($done = curl_multi_info_read($queue)) {
// get the info and content returned on the request
$info = curl_getinfo($done['handle']);
$error = curl_error($done['handle']);
$results = callback(curl_multi_getcontent($done['handle']), $delay);
$responses[$map[(string) $done['handle']]] = compact('info', 'error', 'results');
// remove the curl handle that just completed
curl_multi_remove_handle($queue, $done['handle']);
curl_close($done['handle']);
}
// Block for data in / output; error handling is done by curl_multi_exec
if ($active > 0) {
curl_multi_select($queue, 0.5);
}
} while ($active);
curl_multi_close($queue);
return $responses;
}
3. 两种并发实现的性能对比
改进前后的性能对比试验在LINUX主机上进行, 测试时使用的并发队列如下:
http://item.taobao.com/item.htm?id=14392877692
http://item.taobao.com/item.htm?id=16231676302
http://item.taobao.com/item.htm?id=17037160462
http://item.taobao.com/item.htm?id=5522416710
http://item.taobao.com/item.htm?id=16551116403
http://item.taobao.com/item.htm?id=14088310973
简要说明下实验设计的原则和性能测试结果的格式: 为保证结果的可靠, 每组实验重复20次, 在单次实验中, 给定相同的接口URL集合, 分别测量Classic(指经典的并发机制)和Rolling(指改进后的并发机制)两种并发机制的耗时(秒为单位), 耗时短者胜出(Winner), 并计算节省的时间(Excellence, 秒为单位)以及性能提升比例(Excel. %). 为了尽量贴近真实的请求而又保持实验的简单, 在对返回结果的处理上只是做了简单的正则表达式匹配, 而没有进行其他复杂的操作. 另外, 为了确定结果处理回调对性能对比测试结果的影响, 可以使用usleep模拟现实中比较负责的数据处理逻辑(如提取, 分词, 写入文件或数据库等).
性能测试中用到的回调函数为:
复制代码 代码如下:
function callback($data, $delay) {
preg_match_all('/<h3>(.+)<\/h3>/iU', $data, $matches);
usleep($delay);
return compact('data', 'matches');
}
数据处理回调无延迟时: Rolling Curl略优, 但性能提升效果不明显.
数据处理回调延迟5毫秒: Rolling Curl完胜, 性能提升40%左右.
通过上面的性能对比, 在处理URL队列并发的应用场景中Rolling cURL应该是更加的选择, 并发量非常大(1000+)时, 可以控制并发队列的最大长度, 比如20, 每当1个URL返回并处理完毕之后立即加入1个尚未请求的URL到队列中, 这样写出来的代码会更加健壮, 不至于并发数太大而卡死或崩溃. 详细的实现请参考: http://code.google.com/p/rolling-curl/
相关推荐:
互联网快照:记录数字时代的每个瞬间,全网seo怎么优化内容
什么是seo艺术,什么是seo seo有何价值 ,ai写作生成器 推荐
优化网站的秘诀:提高网站速度与用户体验,助力业务腾飞,旅游网站建设步骤
ChatGPT网络故障报告从协调世界时(UTC)晚上1107左右开始激增,15分钟内引发广泛关注,ai无视进化
产品seo什么意思,产品seo标题是什么 ,ai模仿张宇
未来写作新方式原创AI文章的无限可能
GPT优化:让你的工作与生活更高效、更智能,Ai__79
AI人工智能生成文章:开启写作新时代
AI免费试用不需要登录:体验智能科技的魅力,轻松开启未来,华为ai身材
seo网站排名关键词优化,seo网站关键词优化怎么做 ,ai回廊
如何用AI改文章,让写作更高效、精准,提升内容质量
AI一键生成原创文章,让创作更高效更轻松!
seo网站反链是什么,网站反链怎么做 ,ai插画头像卡通
SEO公司核心业务是什么?揭秘提升网站排名的奥秘,写作助手ai一键生成作文在线
好用的AI写作工具,提升写作效率与创意的最佳选择
ChatGPT的破解版:AI世界的新突破,ai无禁忌
ChatGPT维护-智能时代的数字助手,如何让你的工作更高效,ai智能救援
什么是seo发外链,seo外链类型有哪些 ,小小苏ai
ChatGPT最新版本更新内容:智能对话体验再升级,更多功能与应用,ai证伪
seo适合什么职业,seo有前途么 ,ai小精灵
AI搜索写文章是什么意思?人工智能赋能内容创作的未来,高德地图 ai
京东业绩再创新高:未来电商巨头的成功之道,如何做seo优化留痕
【SEO优化全攻略】提升网站流量的终极秘籍,带你轻松玩转搜索引擎优化!,金融网站推广维护
Chat启用后ESX连不上?解决方法一网打尽!,为什么AI续写这么离谱
AI自动读文:让阅读更轻松、更高效的智能革命,寄ai空
优化服务网-提升客户体验,打造全方位智慧服务平台,东莞网站建设员招聘信息
为什么越来越多的人选择在知乎发布文章?这里面的机会你可能还没发现!,潍坊关键词排名提升
如何快速写出高质量的AI文章:从入门到精通
seo需要会什么技术呢,seo需要会什么技术呢知乎 ,红色框ai
GPT在什么时候被人熟知的?从技术突破到广泛应用的背后故事,ai商业新思维ai课程
《收录情况:数字时代的网络信息检索与价值体现》,山东全域营销推广软件客服电话
文章续写AI:提升写作效率,创意无限
SEO出超:如何通过精准优化实现网站流量大爆发,营销推广方式联系f火15星
SEO优化流程:助力网站快速提升排名的关键策略,1745ai
AI批量文章工具,让写作变得高效与轻松,cs机器人ai
怎么使用AI生成文章,轻松提升写作效率!
SEO职位:数字营销的核心,开启职业新高峰,汕尾网站建设推广厂商
SEO王:掌控搜索引擎优化的至高法则,助力企业飞速腾飞,网站动作优化在哪里下载
Chatttst:开启智能沟通新时代的无限可能,上海联通ai
ChatGPT40不收费版本:科技革新,智能助手助力生活与工作,ai医疗武器有哪些
SEO优化10种策略:提升网站排名的有效方法,帅气ai男头白底
SEO部:开启数字化营销新纪元的幕后英雄,株洲营销推广是什么公司
SEO这样做,轻松引爆流量,助力企业成长,无极标准网站优化好处
自动写文章的AI,提升效率的创作利器
企业如何借助SEO咨询实现精准流量引爆,助力业绩提升,立刻推广的旅游线下营销
SEO检测,让网站排名飞升的秘密武器,高端快消食品营销推广
seo适合什么人做,哪种seo做得好 ,晋城ai论文写作免费
pbootcms自动翻译插件,让你的网站轻松实现多语言覆盖,ai 镀金
seo矩阵运营中心是什么,seo矩阵运营中心是什么意思啊 ,北京ai特效
seo都有什么问题,seo都有什么问题和答案 ,ai凯旋公主下载