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

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

系統 3318 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條評論
主站蜘蛛池模板: 不卡午夜 | 国内自拍青青草 | 91福利一区二区在线观看 | 在线观看日韩欧美 | 日本精品视频 | 日本毛片在线看 | 福利在线国产 | 热久久99精品这里有精品 | 色综合欧美色综合七久久 | 国产成人一区二区三区免费观看 | 天天操天天干天天射 | 国产中文字幕视频在线观看 | 久久99亚洲精品久久 | 久久精品国产99国产精品免费看 | 四虎成人国产精品视频 | 久久欧美精品 | 色婷婷5月精品久久久久 | 欧美123| 69精品 | 国产三级黄色录像 | 精品一久久香蕉国产线看观看下 | 特级黄色毛片 | 中文字幕亚洲区 | 久草在线免费看 | 免费看搡女人的视频 | 天天摸夜夜 | 狠狠色丁香婷婷综合最新地址 | 国产女人水多毛片18 | 在线不卡一区 | 成人特黄午夜性a一级毛片 成人特级毛片69免费观看 | 色鬼综合 | 久久999 | 久久综合给合久久97色美利坚 | 国产日韩欧美二区 | 天天干夜夜爽天天操夜夜爽视频 | 99久久精品视香蕉蕉er热资源 | 999精品国产 | 在线久操 | 爱爱精品视频 | a级精品九九九大片免费看 a级毛片高清免费视频 | 国产 日韩 一区 |