PHP使用curl_multi实现并发请求的方法示例
本文实例讲述了PHP使用curl_multi实现并发请求的方法。分享给大家供大家参考,具体如下:
classCurlMultiUtil{
/**
*根据url,postData获取curl请求对象,这个比较简单,可以看官方文档
*/
privatestaticfunctiongetCurlObject($url,$postData=array(),$header=array()){
$options=array();
$url=trim($url);
$options[CURLOPT_URL]=$url;
$options[CURLOPT_TIMEOUT]=3;
$options[CURLOPT_RETURNTRANSFER]=true;
foreach($headeras$key=>$value){
$options[$key]=$value;
}
if(!empty($postData)&&is_array($postData)){
$options[CURLOPT_POST]=true;
$options[CURLOPT_POSTFIELDS]=http_build_query($postData);
}
if(stripos($url,'https')===0){
$options[CURLOPT_SSL_VERIFYPEER]=false;
}
$ch=curl_init();
curl_setopt_array($ch,$options);
return$ch;
}
/**
*[requestdescription]
*@param[type]$chList
*@return[type]
*/
privatestaticfunctionrequest($chList){
$downloader=curl_multi_init();
//将三个待请求对象放入下载器中
foreach($chListas$ch){
curl_multi_add_handle($downloader,$ch);
}
$res=array();
//轮询
do{
while(($execrun=curl_multi_exec($downloader,$running))==CURLM_CALL_MULTI_PERFORM);
if($execrun!=CURLM_OK){
break;
}
//一旦有一个请求完成,找出来,处理,因为curl底层是select,所以最大受限于1024
while($done=curl_multi_info_read($downloader)){
//从请求中获取信息、内容、错误
//$info=curl_getinfo($done['handle']);
$output=curl_multi_getcontent($done['handle']);
//$error=curl_error($done['handle']);
$res[]=$output;
//把请求已经完成了得curlhandle删除
curl_multi_remove_handle($downloader,$done['handle']);
}
//当没有数据的时候进行堵塞,把CPU使用权交出来,避免上面do死循环空跑数据导致CPU100%
if($running){
$rel=curl_multi_select($downloader,1);
if($rel==-1){
usleep(1000);
}
}
if($running==false){
break;
}
}while(true);
curl_multi_close($downloader);
return$res;
}
/**
*[getdescription]
*@param[type]$urlArr
*@return[type]
*/
publicstaticfunctionget($urlArr){
$data=array();
if(!empty($urlArr)){
$chList=array();
foreach($urlArras$key=>$url){
$chList[]=self::getCurlObject($url);
}
$data=self::request($chList);
}
return$data;
}
}
更多关于PHP相关内容感兴趣的读者可查看本站专题:《phpcurl用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP运算与运算符用法总结》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。