亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

PHP多線程批量采集下載圖片

系統 2768 0

?

使用curl的多線程,另外curl可以設置請求時間,遇到很慢的url資源,可以果斷的放棄,這樣沒有阻塞,另外有多線程請求,效率應該比較高,參考:《 CURL的學習和應用[附多線程] 》,我們再來測試一下;

核心代碼:

?

    /**
     * curl 多線程
     *
     * @param array $array 并行網址
     * @param int $timeout 超時時間
     * @return mix
     */
	public function Curl_http($array,$timeout='15'){
		    $res = array();

		    $mh = curl_multi_init();//創建多個curl語柄

		    foreach($array as $k=>$url){
		        $conn[$k]=curl_init($url);//初始化

		        curl_setopt($conn[$k], CURLOPT_TIMEOUT, $timeout);//設置超時時間
		        curl_setopt($conn[$k], CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
		        curl_setopt($conn[$k], CURLOPT_MAXREDIRS, 7);//HTTp定向級別 ,7最高
		        curl_setopt($conn[$k], CURLOPT_HEADER, false);//這里不要header,加塊效率
		        curl_setopt($conn[$k], CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
		        curl_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 ($active and $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]);//返回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 = 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)$dataimg as $kk=>$vv){
			if($vv !=''){
				$rand = rand(1000,9999);
				$basename = time()."_".$rand.".".jpg;//保存為jpg格式的文件
				$fname = './img/'.$date."/"."$basename";
				file_put_contents($fname, $vv);
				$j++;
				echo "創建第".$j."張圖片"."$fname"."<br/>";
			}else{
				unset($kk,$vv);
			}
		}
	}else{
		unset($matches);
	}
}
$etime = $img->getMicrotime();//結束時間
echo "用時".($etime-$stime)."秒";
exit;
  

?

?

測試一下效果

337張圖片用時260秒左右,基本上可以做到一秒內就可以采集一張的效果,而且發現圖片越到優勢采集速度越明顯。

我們可以看一下文件命名:也就可以做到同一時刻可以生成10張圖片,

由于采用了20秒請求的時間限制,有些圖片生成后有明顯不全,也就是圖片資源在20秒內未能完全采集,這個時間大家可以自行設置。

?

PHP多線程批量采集下載圖片


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 婷婷久久精品 | 成人毛片高清视频观看 | 中文字幕视频免费在线观看 | 四虎永久在线免费观看 | 久久精品视频免费播放 | 国产精品久久免费观看 | 中文字幕一二三区 | 国产高清不卡一区二区 | 夜夜爽夜夜叫夜夜高潮漏水 | 欧洲成人免费视频 | 久久久久久久久久免免费精品 | 日本aⅴ在线 | 久久久精品视频在线观看 | 日本aaaa精品免费视频 | 69精品在线观看 | 在线精品免费视频 | 欧洲亚洲综合一区二区三区 | 四虎在线免费 | 免看一级一片一在线看 | 国产精品亚洲欧美日韩久久 | 国内在线观看 | 久久中文网中文字幕 | 天天色天天草 | 国产一区二区三区亚洲欧美 | 欧美精品午夜毛片免费看 | 亚洲日韩欧美一区二区在线 | 免费看欧美毛片大片免费看 | 亚洲成人一区二区 | 亚洲精品入口一区二区在线观看 | 久久久久久国产精品免费 | 国产成人精品综合久久久 | 午夜香蕉视频 | 国产成人欧美视频在线 | 亚洲午夜视频 | 亚洲国产精品成人久久 | 国产精品亚洲精品不卡 | 精品免费久久久久久影院 | 露脸超嫩97后在线播放 | 中文字幕日本精品一区二区三区 | 动漫精品欧美一区二区三区 | 国产三级久久 |