巅云智能建站平台搭建版(创业流派版)火爆上线,毕生受权!新增:文章智能收罗+全站真静态打包+都会分站+智能小法式+不法词过滤+H5自顺应+智能链词等功效功效概况
建站资讯News

php cURL和Rolling cURL并发体例比拟

0
一佰互联网站扶植(www.taishanly.com) 宣布时候:2020-04-29 09:01:57 阅读数: 87

在实际名目或本身编写小东西(比方消息聚合,商品价钱监控,比价)的进程中, 凡是须要从第3方网站或API接口获得数据, 在须要处置1个URL行列时, 为了进步机能, 能够接纳cURL供给的curl_multi_*族函数完成简略的并发。
本文将切磋两种详细的完成体例, 并对差别的体例做简略的机能对照.
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://a.com/item.htm?id=14392877692
http:/a.com/item.htm?id=16231676302
http://a.com/item.htm?id=5522416710
http://a.com/item.htm?id=16551116403
扼要申明下尝试设想的准绳和机能测试成果的格局: 为保障成果的靠得住, 每组尝试反复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略优, 但机能晋升结果不较着。

一佰互联是天下着名建站品牌办事商,咱们有九年、网站建造、网页设想、php开辟和域名注册及假造主机办事经历,供给的办事更是天下着名。最近几年来还整合团队上风自立开辟了可视化多用户”“3.0平台版,拖拽排版网站建造设想,轻松完成pc站、手机微网站、小法式、APP一体化全网营销网站扶植 ,已胜利的为天下上百家收集公司供给自助建站平台搭建办事。更多资讯:tags标签

上一篇:PHP制止个体IP拜候网站
下一篇: 操纵PHP Socket写的POP3类
[前往消息列表]

相干消息more

24
08月
中国文明导航网

中原文明增进会(以下简称“华促会”)由中国文明界着名人士倡议和构成,于1990年7月在中华公民共和公民政部挂号注册,具有天下性官方文明集体法... >>概况

28
03月
这么做手机网站扶植更助于晋升用户休会感

简介:今朝,良多企业只是扶植PC真个网站,而疏忽了挪动端这个偌大的市场。现在,良多人能够不必电脑,却离不开手机,用手机上彀,阅读网站看视频、... >>概况

21
12月
北京网站设想的免费规范你晓得吗?

在北京网页建造中,是有良多的小网站设想公司的,但他们挑选北京,是由于北京不只仅只是中国的都城,更是良多主要当局决议计划的产地。而这较为发财的都会... >>概况

05
04月
浩繁的PHP开辟东西中,大神竟然都宠爱这款…

简介:明天给大师分享的PHP手艺常识是:PHP开辟者必备的一款IDE——PhpStorm。PhpStorm 2018 Mac 版本,增添了大... >>概况

高端网站扶植

美工统筹SEO,为企业电子商务营销助力!

德律风:

023-85725751
建站

产物

域名注册 假造主机 云办事器 企业邮局
智能建站 APP打包 微站/小法式 创业平台
网站推行 媒体营销 智能收罗 AI机械人
400德律风 短信营销 店销机械人
私家定制 流派网站