手机版

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

时间:2021-11-19 来源:互联网 编辑:宝哥软件园 浏览:

个人认为影响的原因:匹配图片的url不是有效的url,但本文简单判断是否为相对路径。但是有些url是无效的解决方案:添加图片复制代码判断url是否为真,如下:/* * * * * *判断url是否有效* @ param $ URL string * @ return boole */function rel URL($ URL){ if(substr($ URL,0,4)=' http '){ $ array=。if(count($ array)0 is _ array($ array)){ if(preg _ match('/200/',$ array[0]){ unset($ array);返回真;} else { unset($ array);返回false} } else { unset($ array);返回false} } else { return false}}主要使用get_headers函数获取http请求信息,判断服务器响应状态(200)判断url是否真实有效。测试中再次采集图片的结果比之前更差,运行更慢。

测试的原因就是:get _ headers函数虽然可以判断全球资源定位器(统一资源定位符)是否真实有效,但是假如遇到很慢的全球资源定位器(统一资源定位符)资源,因为头脑发热请求没有时间限制,导致这个线程被占用,后续的请求被阻塞文件_获取_内容函数和上面的原因一样,由于某些慢的全球资源定位器(统一资源定位符)资源都长期占用,阻塞后面的进程被占用,长期阻塞中央处理器占用也会增高解决办法;使用卷曲的多线程,另外卷曲可以设置请求时间,遇到很慢的全球资源定位器(统一资源定位符)资源,可以果断的放弃,这样没有阻塞,另外有多线程请求,效率应该比较高,参考: 《CURL的学习和应用[附多线程]》 ,我们再来测试一下;核心代码:复制代码代码如下:/** *卷曲多线程* * @param数组$array并行网址* @ param int $超时超时时间* @返回混合*/public函数Curl_http($array,$ time out=' 15 '){ $ RES=array();$ MH=curl _ multi _ init();//创建多个卷曲语柄foreach($ array as $ k=$ URL){ $ conn[$ k]=curl _ init($ URL);//初始化curl_setopt($conn[$k],CURLOPT_TIMEOUT,$ time out);//设置超时时间curl_setopt($conn[$k],CURLOPT_USERAGENT,' Mozilla/5.0(兼容;MSIE 5.01 windows NT 5.0)');curl_setopt($conn[$k],CURLOPT_MAXREDIRS,7);//HTTp定向级别,7最高curl_setopt($conn[$k],CURLOPT_HEADER,false);//这里不要标题,加块效率curl_setopt($conn[$k],CURLOPT_FOLLOWLOCATION,1);//302重定向curl_setopt($conn[$k],CURLOPT_RETURNTRANSFER,1);//要求结果为字符串且输出到屏幕上curl_setopt($conn[$k],CURLOPT_HTTPGET,true);curl_multi_add_handle ($mh,$ conn[$ k]);} //防止死循环耗死中央处理器这段是根据网上的写法do { $mrc=curl_multi_exec($mh,$ active);//当无数据,active=true } while($ MRC==CURLM _ CALL _ MULTI _ PERFORM);//当正在接受数据时而($active和$mrc==CURLM_OK) {//当无数据时或请求暂停时,active=true if(curl _ multi _ select($ MH)!=-1){ do { $ MRC=curl _ multi _ exec($ MH,$ active);} while($ MRC==CURLM _ CALL _ MULTI _ PERFORM);} } foreach ($array as $k=$url) { if(!curl _ errno($ conn[$ k]){ $ data[$ k]=curl _ multi _ getcontent($ conn[$ k]);//数据转换为array $ header[$ k]=curl _ getinfo($ conn[$ k]);//返回超文本传送协议(超文本传输协议的缩写)头信息curl _ close($ conn[$ k]);//关闭语柄curl_multi_remove_handle($mh,$ conn[$ k]);//释放资源}else{ unset($k,$ URL);} } curl _ multi _ close($ MH);返回$数据;}//参数接收$ callback=$ _ GET[' callback '];$ hrefs=$ _ GET[' hrefs '];$urlarray=explode(',',trim($hrefs,',');$date=date('Ymd ',time());//实例化$ img=new Httpimg();$ stime=$ img-getMicrotime();//开始时间$data=$img-Curl_http($urlarray,' 20 ');//列表数据mkdir(' ./img/' .$date,0777);foreach((array)$ data as $ 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((array)$ data img as $ kk=$ vv){ if($ vv!=''){$rand=rand(1000,9999);$basename=time().'_'.$兰特。'.'。jpg//保存为使用联合图象专家组文件交换格式存储的编码图像文件扩展名格式的文件$fname=' ./img/' .$日期。'/'.$ basename ';file_put_contents($fname,$ vv);$ j;"回声"创建第$j .张图片$fname .br/';}else{unset($kk,$ vv);} } } else { unset($ matches);} } $ etime=$ img-getMicrotime();//结束时间"回声"用时$etime-$stime .'秒;退出;测试一下效果

37张图片大概需要260秒,基本可以达到一秒钟采集一张图片的效果。而且发现图片越有利,采集速度越明显。我们可以看一下文件命名:可以同时生成10张图片。由于20秒的请求时限,有些图片生成后明显不完整,即图片资源在20秒内没有完全收集,可以自行设置这个时间。

版权声明:PHP多线程批量采集下载美图的实现代码(续)是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。