cURL批处理
cURL还有一个高级特性——批处理句柄(handle)。这一特性允许同时或异步打开多了cURL连接。
【示例】:
<span style="font-family:FangSong_GB2312;font-size:18px;"><?PHP
//创建两个cURL资源
$ch1 = curl_init();
$ch2 = curl_init();
//指定URL和适当的参数
curl_setopt($ch1,CURLOPT_URL,"http://lxr.php.net/");
curl_setopt($ch1,CURLOPT_HEADER,0);
curl_setopt($ch2,CURLOPT_URL,"http://www.php.net/");
curl_setopt($ch2,CURLOPT_HEADER,0);
//创建cURL批处理句柄
$mh = curl_multi_init();
//加上前面两个资源的句柄
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
//预定义一个状态变量
$active = NULL;
//执行批处理
do{
$mrc = curl_multi_exec($mh,$active);
}while($mrc == CURLM_CALL_MULTI_PERFORM);
while($active && $mrc ==CURLM_OK){
if(curl_multi_select($mh) != -1){
do{
$mrc =curl_multi_exec($mh,$active);
}while($mrc ==CURLM_CALL_MULTI_PERFORM);
}
}
//关闭各个句柄
curl_multi_remove_handle($mh,$ch1);
curl_multi_remove_handle($mh,$ch2);
curl_multi_close($mh);
?></span>
【解析】:
这里要做的就是打开多个cURL句柄并指派给一个批处理句柄,然后只需在一个while循环里等待它执行完毕。
第一个do …while循环重复调用curl_multi_exec()。这个函数是无隔断的。但会尽可能少的执行。它会返回一个状态值,只要这个值等于常量CURM_CALL_MULTI_PERFORM,就代表还有一些刻不容缓的工作要做。(例如把对应的URL的HTTP头信息发送出去),也就是说,需要不断调用该函数,直到返回值发生改变。
接下来的while循环,只有在$active变量为true的时候继续这一变量之前作为第二个参数传给了curl_multi_exec(),代表只要批处理句柄中是否还有活动连接。接着调用curl_multi_select(),在活动连接出现之前,它都是被屏蔽的。这个函数成功之后,又会进入另一个do…while循环,继续下一条URL。
【说明】:
很多人把这种方式称为cURL多线程处理,而curl_multi_exec并不是多线程,它属于异步处理的范畴。