PHP中巧用curl 并发减小获取第三方网页内容时间

WBOY
Release: 2016-06-13 12:19:34
Original
1029 people have browsed it

PHP中巧用curl 并发减少获取第三方网页内容时间
前言:


在我们平时的程序中难免出现同时访问几个接口的情况,平时我们用curl进行访问的时候,一般都是单个、顺序访问,假如有3个接口,每个接口耗时500毫秒那么我们三个接口就要花费1500毫秒了,这个问题太头疼了严重影响了页面访问速度,有没有可能并发访问来提高速度呢?今天就简单的说一下,利用curl并发来提高页面访问速度, 希望大家多指导。


1、老的curl访问方式以及耗时统计


<?phpfunction curl_fetch($url, $timeout=3){    $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $url);    curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    $data = curl_exec($ch);    $errno = curl_errno($ch);    if ($errno>0) {        $data = false;    }    curl_close($ch);    return $data;}function microtime_float(){   list($usec, $sec) = explode(" ", microtime());   return ((float)$usec + (float)$sec);}$url_arr=array(     "taobao"=>"http://www.taobao.com",     "sohu"=>"http://www.sohu.com",     "lai18"=>"http://www.lai18.com",);$time_start = microtime_float();$data=array();foreach ($url_arr as $key=>$val){     $data[$key]=curl_fetch($val);}$time_end = microtime_float();$time = $time_end - $time_start;echo "耗时:{$time}";?>
Copy after login

耗时:0.614秒


2、curl并发访问方式以及耗时统计

<?phpfunction curl_multi_fetch($urlarr=array()){    $result=$res=$ch=array();    $nch = 0;    $mh = curl_multi_init();    foreach ($urlarr as $nk => $url) {        $timeout=2;        $ch[$nch] = curl_init();        curl_setopt_array($ch[$nch], array(            CURLOPT_URL => $url,            CURLOPT_HEADER => false,            CURLOPT_RETURNTRANSFER => true,            CURLOPT_TIMEOUT => $timeout,        ));        curl_multi_add_handle($mh, $ch[$nch]);        ++$nch;    }    /* wait for performing request */    do {        $mrc = curl_multi_exec($mh, $running);    } while (CURLM_CALL_MULTI_PERFORM == $mrc);     while ($running && $mrc == CURLM_OK) {        // wait for network        if (curl_multi_select($mh, 0.5) > -1) {            // pull in new data;            do {                $mrc = curl_multi_exec($mh, $running);            } while (CURLM_CALL_MULTI_PERFORM == $mrc);        }    }     if ($mrc != CURLM_OK) {        error_log("CURL Data Error");    }     /* get data */    $nch = 0;    foreach ($urlarr as $moudle=>$node) {        if (($err = curl_error($ch[$nch])) == '') {            $res[$nch]=curl_multi_getcontent($ch[$nch]);            $result[$moudle]=$res[$nch];        }        else        {            error_log("curl error");        }        curl_multi_remove_handle($mh,$ch[$nch]);        curl_close($ch[$nch]);        ++$nch;    }    curl_multi_close($mh);    return  $result;}$url_arr=array(     "taobao"=>"http://www.taobao.com",     "sohu"=>"http://www.sohu.com",     "lai18"=>"http://www.lai18.com",     );function microtime_float(){   list($usec, $sec) = explode(" ", microtime());   return ((float)$usec + (float)$sec);}$time_start = microtime_float();$data=curl_multi_fetch($url_arr);$time_end = microtime_float();$time = $time_end - $time_start; echo "耗时:{$time}";?>
Copy after login

耗时:0.316秒 帅气吧整个页面访问后端接口的时间节省了一半



《CURL技术知识教程》系列技术文章整理收藏

http://blog.csdn.net/hello_katty/article/details/45557423

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template