当前位置: 首页 > 科技观察

PHP多线程批量采集和下载美图的实现代码

时间:2023-03-12 21:49:46 科技观察

使用curl的多线程,curl可以设置请求时间。遇到比较慢的url资源,可以果断放弃,这样就没有阻塞了。此外,多线程请求应该更高效。下面是代码实现:/***curl多线程*@authorhttp://www.lai18.com*@paramarray$arrayParallelURL*@paramint$timeouttimeout*@returnmix*/publicfunctionCurl_http($array,$timeout='15'){$res=array();$mh=curl_multi_init();//创建多个curlhandlesforeach($arrayas$k=>$url){$conn[$k]=curl_init($url);//初始化curl_setopt($conn[$k],CURLOPT_TIMEOUT,$timeout);//设置超时时间curl_setopt($conn[$k],CURLOPT_USERAGENT,'Mozilla/5.0(compatible;MSIE5.01;WindowsNT5.0)');curl_setopt($conn[$k],CURLOPT_MAXREDIRS,7);//HTTP定向级别,7最高conn[$k],CURLOPT_FOLLOWLOCATION,1);//302redirectcurl_setopt($conn[$k],CURLOPT_RETURNTRANSFER,1);//要求结果为字符串输出到屏幕curl_setopt($conn[$k],CURLOPT_HTTPGET,true);curl_multi_add_handle($mh,$conn[$k]);}//防止死循环消耗cpu,本节根据网上的写法do{$mrc=curl_multi_exec($mh,$active);//没有数据时,active=true}while($mrc==CURLM_CALL_MULTI_PERFORM);//接收数据时while($activeand$mrc==CURLM_OK){//没有数据时active=trueif(curl_multi_select($mh)!=-1){do{$mrc=curl_multi_exec($mh,$active);}while($mrc==CURLM_CALL_MULTI_PERFORM);}}foreach($arrayas$k=>$url){if(!curl_errno($conn[$k])){$data[$k]=curl_multi_getcontent($conn[$k]);//数据转换为数组$header[$k]=curl_getinfo($conn[$k]);//返回http头信息curl_close($conn[$k]);//关闭句柄curl_multi_remove_handle($mh,$conn[$k]);//释放资源}else{unset($k,$url);}}curl_multi_close($mh);return$data;}//接收参数$callback=$_GET['callback'];$hrefs=$_GET['hrefs'];$urlarray=explode(',',trim($hrefs,','));$date=date('Ymd',time());//实例化$img=newHttpImg();$stime=$img->getMicrotime();//开始时间$data=$img->Curl_http($urlarray,'20');//列出数据mkdir('./img/'.$date,0777);foreach((array)$dataas$k=>$v){preg_match_all("/(href|src)=(["|']?)([^"'>]+.(jpg|png|PNG|JPG|gif))\2/i",$v,$matches[$k]);if(count($matches[$k][3])>0){$dataimg=$img->Curl_http($matches[$k][3],'20');//所有图像数据二进制$j=0;foreach((数组)$dataimgas$kk=>$vv){if($vv!=''){$rand=rand(1000,9999);$basename=time()."_".$rand.".".jpg;//保存为jpg格式的文件$fname='./img/'.$date."/"."$basename";file_put_contents($fname,$vv);$j++;echo"Createimage".$j.""."$fname"."
";}else{unset($kk,$vv);}}}else{unset($matches);}}$etime=$img->getMicrotime();//结束时间echo"time".($etime-$stime)."seconds";exit;