PHP使用curl并发减少后端访问时间的方法

作者 : 慕源网 本文共2325个字,预计阅读时间需要6分钟 发布时间: 2021-09-20 共653人阅读

在我们平时的程序中有时候会出现同时访问几个接口的情况,我们都是用curl进行访问,而这种访问一般都是单个、顺序访问的。那么问题来咯,假如有3个接口,每个接口耗时500毫秒,这样三个接口就要花费1500毫秒了,这个问题很严重,严重影响了页面访问速度。

 

有没有可能并发访问来提高速度呢?今天就简单的说一下,利用 curl并发来提高页面访问速度

 

看看单个,顺序curl访问方式以及耗时统计

<?php

 

function 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秒  显然这是不可取的。来看看并发的效果

 

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

<?php

 

function 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”,

“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.614秒  显然这是不可取的。来看看并发的效果

 

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

 


慕源网 » PHP使用curl并发减少后端访问时间的方法

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录