快捷搜索:

PHP中的curl_multi一族函数

信托许多人对php手册中语焉不详的curl_multi一族的函数头疼不已,它们文档少,给的例子 更是简单的让你无从借鉴,我也曾经找了许多网页,都没见一个完备的利用例子。

curl_multi_add_handle

curl_multi_close

curl_multi_exec

curl_multi_getcontent

curl_multi_info_read

curl_multi_init

curl_multi_remove_handle

curl_multi_select

一样平常来说,想到要用这些函数时,目的显然应该是要同时哀求多个url,而不是一个一个依次哀求,否则不如自己轮回去调curl_exec好了。

步骤总结如下:

第一步:调用curl_multi_init

第二步:轮回调用curl_multi_add_handle

这一步必要留意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle。

第三步:持续调用curl_multi_exec

第四步:根据必要轮回调用curl_multi_getcontent获取结果

第五步:调用curl_multi_remove_handle,并为每个字handle调用curl_close

第六步:调用curl_multi_close

这里有一个网上找的简单例子,其作者称为dirty的例子,(稍后我会阐明为何dirty):

/*

Here’s a quick and dirty example for curl-multi from PHP, tested on PHP 5.0.0RC1 CLI / FreeBSD 5.2.1

*/

 $connomains = array(

"http://www.cnn.com/",

"http://www.canada.com/",

"http://www.yahoo.com/"

);

 $mh = curl_multi_init();

foreach ( $connomains as  $i =>  $url) {

 $conn[ $i]=curl_init( $url);

curl_setopt( $conn[ $i],CURLOPT_RETURNTRANSFER,1);

curl_multi_add_handle ( $mh, $conn[ $i]);

}

do {  $n=curl_multi_exec( $mh, $active); } while ( $active);

foreach ( $connomains as  $i =>  $url) {

 $res[ $i]=curl_multi_getcontent( $conn[ $i]);

curl_close( $conn[ $i]);

}

print_r( $res);

全部应用历程差不多便是这样,然则,这个简单代码有个致命弱点,便是在do轮回的那段,在全部url哀求时代是个逝世轮回,它会随意马虎导致CPU占用100%。

现在我们来改进它,这里要用到一个险些没有任何文档的函数curl_multi_select了,虽然C的curl库对select有阐明,然则,php里的接口和用法确与C中有不合。

把上面do的那段改成下面这样:

do {

 $mrc = curl_multi_exec( $mh, $active);

} while ( $mrc == CURLM_CALL_MULTI_PERFORM);

while ( $active and  $mrc == CURLM_OK) {   if (curl_multi_select( $mh) != -1) {

do {

 $mrc = curl_multi_exec( $mh,  $active);

} while ( $mrc == CURLM_CALL_MULTI_PERFORM);

}

}

由于 $active要等整个url数据吸收完毕才变成false,以是这里用到了

curl_multi_exec的返回值判断是否还稀有据,当稀有据的时刻就不绝调用curl_multi_exec,暂时没稀有据就进入select阶段,新数据一来就可以被唤醒继承履行。这里的好处便是CPU的无谓耗损没有了。

别的:还有一些细节的地方可能无意偶尔候要碰到:

节制每一个哀求的超韶光阴,在curl_multi_add_handle之前经由过程curl_setopt去做:

curl_setopt( $ch, CURLOPT_TIMEOUT,  $timeout);

判断是否超时了或者其他差错,在curl_multi_getcontent之前用:curl_error( $conn[ $i]);

您可能还会对下面的文章感兴趣: