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并不是多线程,它属于异步处理的范畴。
时间: 2024-12-20 04:21:41