PHP多線程批量採集上傳圖片

來源:互聯網
上載者:User
PHP多線程批量採集下載圖片

?

使用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"."
";}else{unset($kk,$vv);}}}else{unset($matches);}}$etime = $img->getMicrotime();//結束時間echo "用時".($etime-$stime)."秒";exit;

?

?

測試一下效果

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

我們可以看一下檔案命名:也就可以做到同一時刻可以產生10張圖片,

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

?

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.