您的位置:首页技术文章
文章详情页

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

【字号: 日期:2022-09-13 13:35:52浏览:3作者:猪猪
前言:

在我们平时的程序中难免出现同时访问几个接口的情况,平时我们用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', 'sina'=>'http://www.sina.com.cn',);$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}';?>

耗时: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 networkif (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', 'sina'=>'http://www.sina.com.cn', );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}';?>

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

原文:http://www.searchtb.com/2010/12/using-multicurl-to-improve-performance.html

标签: PHP
相关文章: