前言:
在我们平时的程序中难免出现同时访问几个接口的情况,而且用老的curl进行访问的时候,一般都是单个、顺序访问,假如有3个接口,每个接口耗时500毫秒那么我们三个接口加起来就是1500毫秒了,这个问题太头疼了,严重影响了页面访问速度,有没有可能并发访问来提高速度呢?今天就简单的说一下,利用curl并发来提高页面访问速度,希望大家多指导。
1、老的curl访问方式以及耗时统计
01 |
function curl_fetch($url, $timeout=3){ |
03 |
curl_setopt($ch, CURLOPT_URL, $url); |
04 |
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); |
05 |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
06 |
$data = curl_exec($ch); |
07 |
$errno = curl_errno($ch); |
14 |
function microtime_float() |
16 |
list($usec, $sec) = explode(" ", microtime()); |
17 |
return ((float)$usec + (float)$sec); |
24 |
$time_start = microtime_float(); |
26 |
foreach ($url_arr as $key=>$val) |
28 |
$data[$key]=curl_fetch($val); |
30 |
$time_end = microtime_float(); |
31 |
$time = $time_end - $time_start; |
耗时:0.614秒
2、curl并发访问方式以及耗时统计
01 |
function curl_multi_fetch($urlarr=array()){ |
02 |
$result=$res=$ch=array(); |
04 |
$mh = curl_multi_init(); |
05 |
foreach ($urlarr as $nk => $url) { |
07 |
$ch[$nch] = curl_init(); |
08 |
curl_setopt_array($ch[$nch], array( |
10 |
CURLOPT_HEADER => false, |
11 |
CURLOPT_RETURNTRANSFER => true, |
12 |
CURLOPT_TIMEOUT => $timeout, |
14 |
curl_multi_add_handle($mh, $ch[$nch]); |
19 |
$mrc = curl_multi_exec($mh, $running); |
20 |
} while (CURLM_CALL_MULTI_PERFORM == $mrc); |
22 |
while ($running && $mrc == CURLM_OK) { |
24 |
if (curl_multi_select($mh, 0.5) > -1) { |
27 |
$mrc = curl_multi_exec($mh, $running); |
28 |
} while (CURLM_CALL_MULTI_PERFORM == $mrc); |
32 |
if ($mrc != CURLM_OK) { |
33 |
error_log("CURL Data Error"); |
38 |
foreach ($urlarr as $moudle=>$node) { |
39 |
if (($err = curl_error($ch[$nch])) == '') { |
40 |
$res[$nch]=curl_multi_getcontent($ch[$nch]); |
41 |
$result[$moudle]=$res[$nch]; |
45 |
error_log("curl error"); |
47 |
curl_multi_remove_handle($mh,$ch[$nch]); |
48 |
curl_close($ch[$nch]); |
51 |
curl_multi_close($mh); |
59 |
function microtime_float() |
61 |
list($usec, $sec) = explode(" ", microtime()); |
62 |
return ((float)$usec + (float)$sec); |
64 |
$time_start = microtime_float(); |
65 |
$data=curl_multi_fetch($url_arr); |
66 |
$time_end = microtime_float(); |
67 |
$time = $time_end - $time_start; |
耗时:0.316秒
帅气吧,整个页面访问后端接口的时间节省了一半!
3、curl相关参数
来自:http://cn2.php.net/manual/en/ref.curl.php
curl_close ― Close a cURL session
curl_copy_handle ― Copy a cURL handle along with all of its preferences
curl_errno ― Return the last error number
curl_error ― Return a string containing the last error for the current session
curl_exec ― Perform a cURL session
curl_getinfo ― Get information regarding a specific transfer
curl_init ― Initialize a cURL session
curl_multi_add_handle ― Add a normal cURL handle to a cURL multi handle
curl_multi_close ― Close a set of cURL handles
curl_multi_exec ― Run the sub-connections of the current cURL handle
curl_multi_getcontent ― Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set
curl_multi_info_read ― Get information about the current transfers
curl_multi_init ― Returns a new cURL multi handle
curl_multi_remove_handle ― Remove a multi handle from a set of cURL handles
curl_multi_select ― Wait for activity on any curl_multi connection
curl_setopt_array ― Set multiple options for a cURL transfer
curl_setopt ― Set an option for a cURL transfer
curl_version ― Gets cURL version information
4、下期预告:(三)php与opcode缓存