前言:
在我们平时的程序中难免出现同时访问几个接口的情况,而且用老的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缓存