国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

使用file_get_content系列函數和使用curl系列函數采集圖片的性能對比

2019-11-15 02:06:58
字體:
來源:轉載
供稿:網友
使用file_get_content系列函數和使用curl系列函數采集圖片的性能對比

  由于公司的一個汽車網站的后臺的汽車內容都是主要是來自與汽車之家的,編輯的同事們必須天天手動去對著汽車之家來添加汽車,實在是太蛋疼了。于是乎,為了改變這種狀況,作為一個開發碼農,我的任務就來了。。。那就是準備做一個功能,只要粘貼對應的汽車之家的網址url就能對這些數據進行自動填充到我們后臺的表單中,目前基本的填充都實現了,但是還是沒有能夠把對應的汽車相冊采集進來。

  采集圖片的功能我以前也做過,但是汽車之家大部分的汽車都有挺多圖片的,開始的時候,我打算使用以前的采集圖片的辦法,也就是使用file_get_content獲取url對應的內容,然后匹配到圖片的地址,再使用file_get_content獲取這些圖片url的內容,再載入到本地去,代碼如下:

<?phpheader('Content-type:text/html;charset=utf-8');set_time_limit(0);class runtime  {      var $StartTime = 0;      var $StopTime = 0;         function get_microtime()      {          list($usec, $sec) = explode(' ', microtime());          return ((float)$usec + (float)$sec);      }         function start()      {          $this->StartTime = $this->get_microtime();      }         function stop()      {          $this->StopTime = $this->get_microtime();      }         function spent()      {          return round(($this->StopTime - $this->StartTime) * 1000, 1);      }     }  $runtime= new runtime();  $runtime->start();  $url = 'http://car.autohome.com.cn/pic/series-s15306/289.html#pvareaid=102177';$rs = file_get_contents($url);// echo $rs;exit;

  結果發現,這種方法少圖片還好,圖片多了,那是相當的卡。。就本地測試也比較難跑,更不如說到時候上線了。百度之后,我采用了curl的辦法來下載圖片,經過測試后的確有所改善,但是感覺還是有點慢,要是php有多線程那有多好。。。

  又經過一番折騰和找資料,發現php的curl庫其實還是可以模擬多線程的,那就是使用curl_multi_*系列的函數,經過改寫,代碼又變成了這樣:

  

<?phpheader('Content-type:text/html;charset=utf-8');set_time_limit(0);class runtime  {      var $StartTime = 0;      var $StopTime = 0;         function get_microtime()      {          list($usec, $sec) = explode(' ', microtime());          return ((float)$usec + (float)$sec);      }         function start()      {          $this->StartTime = $this->get_microtime();      }         function stop()      {          $this->StopTime = $this->get_microtime();      }         function spent()      {          return round(($this->StopTime - $this->StartTime) * 1000, 1);      }     }  $runtime= new runtime();  $runtime->start();  $url = 'http://car.autohome.com.cn/pic/series-s15306/289.html#pvareaid=102177';$rs = file_get_contents($url);preg_match_all('/(//pic//series-s15306//289-/d+/.html)/', $rs, $urlArr);$avalie = array_unique($urlArr[0]);$count = array();foreach ($avalie as $key => $ul) {   $pattern = '/<img src="(http:////car1/.autoimg/.cn//upload///d+///d+///d+//.*?/.jpg)"/';   preg_match_all($pattern, file_get_contents('http://car.autohome.com.cn'.$ul), $imgSrc);   $count = array_merge($count, $imgSrc[1]);}$handle = curl_multi_init();foreach($count as $k => $v) {  $curl[$k] = curl_init($v);  curl_setopt($curl[$k], CURLOPT_RETURNTRANSFER, 1);  curl_setopt($curl[$k], CURLOPT_HEADER, 0);  curl_setopt($curl[$k], CURLOPT_TIMEOUT, 30);  curl_multi_add_handle ($handle, $curl[$k]);}$active = null;do {    $mrc = curl_multi_exec($handle, $active);} while ($mrc == CURLM_CALL_MULTI_PERFORM);while ($active && $mrc == CURLM_OK) {    // 這句在php5.3以后的版本很關鍵,因為沒有這句,可能curl_multi_select可能會永遠返回-1,這樣就永遠死在循環里了    while (curl_multi_exec($handle, $active) === CURLM_CALL_MULTI_PERFORM);    if (curl_multi_select($handle) != -1) {        do {            $mrc = curl_multi_exec($handle, $active);        } while ($mrc == CURLM_CALL_MULTI_PERFORM);    }}foreach ($curl as $k => $v) {    if (curl_error($curl[$k]) == "") {        $data[$k] = curl_multi_getcontent($curl[$k]);    }    curl_multi_remove_handle($handle, $curl[$k]);    curl_close($curl[$k]);}foreach($data as $k=>$v) {    $file = time().'_'.rand(1000, 9999).'.jpg';    file_put_contents('./pic3/'.$file, $v); }curl_multi_close($handle);$runtime->stop();  echo "頁面執行時間: ".$runtime->spent()." 毫秒"; 

  好了,多線程的采集真是非常酸爽,然后通過一系列的測試和對比,5次測試,curl多線程有4次是快于file_get_content的,而且時間還是file_get_content的3~5倍,總結起來,以后采集都盡量使用這種辦法,提高效率不在話下。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 尤溪县| 芜湖县| 锦州市| 丰顺县| 壶关县| 陇西县| 彰武县| 本溪市| 宁城县| 新化县| 普定县| 时尚| 隆安县| 永兴县| 新建县| 安吉县| 榆树市| 东港市| 江津市| 武冈市| 甘南县| 西乌珠穆沁旗| 沈阳市| 孟津县| 和政县| 丹阳市| 延津县| 自治县| 石门县| 徐闻县| 玉林市| 宜宾市| 施秉县| 杂多县| 恭城| 兴国县| 岳西县| 台江县| 禄劝| 永清县| 云和县|