亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

php使用curl下載指定大小的文件實例代碼

2024-05-05 00:00:20
字體:
來源:轉載
供稿:網友

php中使用基于libcurl的curl函數,可以對目標url發起http請求并獲取返回的響應內容。通常的請求方式類似如下的代碼:

public function callFunction($url, $postData, $method, header=''){  $maxRetryTimes = 3;  $curl = curl_init();  /******初始化請求參數start******/  if(strtoupper($method) !== 'GET' && $postData){    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($postData));  }elseif (strtoupper($method) === 'GET' && $postData){    $url .= '?'. http_build_query($postData);  }  /******初始化請求參數end******/  curl_setopt_array($curl, array(    CURLOPT_URL => $url,    CURLOPT_TIMEOUT => 10,    CURLOPT_NOBODY => 0,    CURLOPT_RETURNTRANSFER => 1  ));  if(method == 'POST'){    curl_setopt($curl, CURLOPT_POST, true);  }  if(false == empty()){    curl_setopt($curl, CURLOPT_HTTPHEADER, $header);  }  $response = false;  while(($response === false) && (--$maxRetryTimes > 0)){    $response = trim(curl_exec($curl));  }  return $response;}

上面代碼中的這個$response是curl發起的這次http請求從$url獲取到的數據,如果沒有在$header中通過range來指定要下載的大小,無論這個資源多大,那么都要請求完整的并返回的是這個URI的完整內容。通常只用curl來請求求一些接口或者遠程調用一個函數獲取數據,,所以這個場景下CURLOPT_TIMEOUT這個參數很重要。

對于curl的使用場景不止訪問數據接口,還要對任意的url資源進行檢測是否能提供正確的http服務。當用戶填入的url是一個資源文件時,例如一個pdf或者ppt之類的,這時候如果網絡狀況較差的情況下用curl請求較大的資源,將不可避免的出現超時或者耗費更多的網絡資源。之前的策略是完全下載(curl會下載存儲在內存中),請求完后檢查內容大小,當超過目標值就把這個監控的任務暫停。這樣事發后限制其實治標不治本,終于客戶提出了新的需求,不能停止任務只下載指定大小的文件并返回md5值由客戶去校驗正確性。

經過了一些嘗試,解決了這個問題,記錄過程如下文。

1、嘗試使用 CURLOPT_MAXFILESIZE。

對php和libcurl的版本有版本要求,完全的事前處理,當發現目標大于設置時,直接返回了超過大小限制的錯誤而不去下載目標了,不符合要求。

2、使用curl下載過程的回調函數。

參考 http://php.net/manual/en/function.curl-setopt-array.php ,最終使用了CURLOPT_WRITEFUNCTION參數設置了on_curl_write,該函數將會1s中被回調1次。

$ch = curl_init();$options = array(CURLOPT_URL    => 'http://www.php.net/',CURLOPT_HEADER    => false,CURLOPT_HEADERFUNCTION  => 'on_curl_header',CURLOPT_WRITEFUNCTION  => 'on_curl_write');

最終我的實現片段:

function on_curl_write($ch, $data){  $pid = getmypid();  $downloadSizeRecorder = DownloadSizeRecorder::getInstance($pid);  $bytes = strlen($data);  $downloadSizeRecorder->downloadData .= $data;  $downloadSizeRecorder->downloadedFileSize += $bytes;//  error_log(' on_curl_write '.$downloadSizeRecorder->downloadedFileSize." > {$downloadSizeRecorder->maxSize} /n", 3, '/tmp/hyb.log');  //確保已經下載的內容略大于最大限制  if (($downloadSizeRecorder->downloadedFileSize - $bytes) > $downloadSizeRecorder->maxSize) {    return false;  }  return $bytes; //這個不正確的返回,將會報錯,中斷下載 "errno":23,"errmsg":"Failed writing body (0 != 16384)"}

DownloadSizeRecorder是一個單例模式的類,curl下載時記錄大小,實現返回下載內容的md5等。

class DownloadSizeRecorder{  const ERROR_FAILED_WRITING = 23; //Failed writing body  public $downloadedFileSize;  public $maxSize;  public $pid;  public $hasOverMaxSize;  public $fileFullName;  public $downloadData;  private static $selfInstanceList = array();  public static function getInstance($pid)  {    if(!isset(self::$selfInstanceList[$pid])){      self::$selfInstanceList[$pid] = new self($pid);    }    return self::$selfInstanceList[$pid];  }  private function __construct($pid)  {    $this->pid = $pid;    $this->downloadedFileSize = 0;    $this->fileFullName = '';    $this->hasOverMaxSize = false;    $this->downloadData = '';  }  /**   * 保存文件   */  public function saveMaxSizeData2File(){    if(empty($resp_data)){      $resp_data = $this->downloadData;    }    $fileFullName = '/tmp/http_'.$this->pid.'_'.time()."_{$this->maxSize}.download";    if($resp_data && strlen($resp_data)>0)    {      list($headerOnly, $bodyOnly) = explode("/r/n/r/n", $resp_data, 2);      $saveDataLenth = ($this->downloadedFileSize < $this->maxSize) ? $this->downloadedFileSize : $this->maxSize;      $needSaveData = substr($bodyOnly, 0, $saveDataLenth);      if(empty($needSaveData)){        return;      }      file_put_contents($fileFullName, $needSaveData);      if(file_exists($fileFullName)){        $this->fileFullName = $fileFullName;      }    }  }  /**   * 返回文件的md5   * @return string   */  public function returnFileMd5(){    $md5 = '';    if(file_exists($this->fileFullName)){      $md5 = md5_file($this->fileFullName);    }    return $md5;  }  /**   * 返回已下載的size   * @return int   */  public function returnSize(){    return ($this->downloadedFileSize < $this->maxSize) ? $this->downloadedFileSize : $this->maxSize;  }  /**   * 刪除下載的文件   */  public function deleteFile(){    if(file_exists($this->fileFullName)){      unlink($this->fileFullName);    }  }}

curl請求的代碼實例中,實現限制下載大小

……curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'on_curl_write');//設置回調函數……$pid = getmypid();$downloadSizeRecorder = DownloadSizeRecorder::getInstance($pid);$downloadSizeRecorder->maxSize = $size_limit;……//發起curl請求$response = curl_exec($ch);……//保存文件,返回md5$downloadSizeRecorder->saveMaxSizeData2File(); //保存$downloadFileMd5 = $downloadSizeRecorder->returnFileMd5();$downloadedfile_size = $downloadSizeRecorder->returnSize();$downloadSizeRecorder->deleteFile();

到這里,踩了一個坑。增加了on_curl_write后,$response會返回true,導致后面取返回內容的時候異常。好在已經實時限制了下載的大小,用downloadData來記錄了已經下載的內容,直接可以使用。

if($response === true){  $response = $downloadSizeRecorder->downloadData;}

總結

以上所述是小編給大家介紹的php使用curl下載指定大小的文件,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美综合图区| 日本高清不卡的在线| 91精品91久久久久久| 欧美巨猛xxxx猛交黑人97人| 亚洲欧美在线看| 日韩电视剧免费观看网站| 欧美日韩加勒比精品一区| 久久av.com| 久久成人精品电影| 久久久久久综合网天天| 日韩中文字幕网址| 欧美极品少妇xxxxx| 日韩国产精品亚洲а∨天堂免| 午夜精品蜜臀一区二区三区免费| 精品国产老师黑色丝袜高跟鞋| 欧美综合第一页| 成人黄色av免费在线观看| 久久久精品久久久| 亚洲自拍偷拍色片视频| 亚洲视频视频在线| 国产精品色午夜在线观看| 中文字幕最新精品| 国产97在线亚洲| 亚洲自拍另类欧美丝袜| 成人精品一区二区三区电影免费| 国产精品久久久999| 欧美激情伊人电影| 在线看日韩av| 日韩色av导航| 国产精品美女在线观看| 成人国产在线激情| 欧美麻豆久久久久久中文| 国产精品久久久久久久久久久久久久| 美女久久久久久久久久久| 亚洲深夜福利视频| 91久久久久久久久久久| 国产精品盗摄久久久| 亚洲国产欧美自拍| 欧美大片第1页| 欧美在线视频网站| 欧美在线性爱视频| 69**夜色精品国产69乱| 欧美在线观看日本一区| 欧美一级淫片丝袜脚交| 久久免费精品日本久久中文字幕| 伊人久久大香线蕉av一区二区| 日韩国产在线播放| 91国自产精品中文字幕亚洲| 欧美黄色片在线观看| 亚洲国产成人爱av在线播放| 欧美中文字幕视频在线观看| 国产精品亚洲视频在线观看| 国产在线视频欧美| 国产精品久久久久久久久借妻| 欧美一区二区.| 国产一区二区三区四区福利| 欧美日韩国产在线播放| 亚洲激情视频在线观看| 久久久欧美一区二区| 亚洲自拍小视频免费观看| 亚洲国产精品嫩草影院久久| 7777kkkk成人观看| 91精品视频免费| 国产日韩精品入口| 欧美在线视频免费播放| 国产欧美日韩91| 日韩久久免费视频| 亚洲精品美女网站| 欧美极品美女电影一区| 日韩美女在线看| 国产精品久久久久久久久久东京| 亚洲大胆美女视频| 久久夜色精品国产亚洲aⅴ| 日产精品久久久一区二区福利| 久久久久久久久久久免费精品| 日本久久久久久| 久久不射电影网| 亚洲欧美一区二区精品久久久| 国产日韩精品综合网站| 69视频在线免费观看| 国产精品国产三级国产aⅴ9色| 亚洲欧美日韩中文在线| 少妇高潮久久久久久潘金莲| 日韩a**站在线观看| 午夜精品一区二区三区视频免费看| 亚洲精品中文字| 欧美与欧洲交xxxx免费观看| 色777狠狠综合秋免鲁丝| 欧美国产日产韩国视频| 久久久在线观看| 日本电影亚洲天堂| 成人精品在线观看| 日韩在线观看av| 欧美亚洲第一区| 亚洲免费福利视频| 亚洲日本中文字幕| 日韩欧美国产成人| 欧美日韩电影在线观看| 国产精品一二三在线| 日韩av快播网址| 国产69精品久久久久9999| 国产精品免费小视频| 91成人福利在线| 国产成人综合av| 亚洲国产成人在线播放| 91美女福利视频高清| 欧美综合第一页| 日本不卡高字幕在线2019| 91禁外国网站| 久久免费视频网| 一本一本久久a久久精品牛牛影视| 国产99视频在线观看| 国产精品自拍视频| 色悠悠久久久久| 欧美国产在线电影| 久久av在线看| 久久人人看视频| 懂色av中文一区二区三区天美| 久久久av网站| 精品人伦一区二区三区蜜桃免费| 夜色77av精品影院| 国产精品xxxxx| 黑人巨大精品欧美一区二区三区| 国产精品电影一区| 欧美三级xxx| 欧美日韩亚洲一区二区三区| 中文字幕在线观看亚洲| 日本精品视频网站| 精品久久久久久中文字幕大豆网| 亚洲人午夜色婷婷| 亚洲japanese制服美女| 久久综合九色九九| 欧美大肥婆大肥bbbbb| 隔壁老王国产在线精品| 久久人人爽亚洲精品天堂| 国产日韩亚洲欧美| 亚洲欧美日韩国产精品| 欧美在线视频观看| 91美女高潮出水| 国产精品国产福利国产秒拍| 国产一区二区三区直播精品电影| 国产精品国产三级国产专播精品人| 欧美中文字幕视频在线观看| 中文字幕亚洲欧美一区二区三区| 日本成熟性欧美| 欧美中文字幕在线| 欧美日韩美女在线观看| 久久视频在线直播| 亚洲a∨日韩av高清在线观看| 综合国产在线观看| 精品国产老师黑色丝袜高跟鞋| 国产精品免费网站| 日韩激情视频在线播放| 日本欧美国产在线| 2025国产精品视频| 国产日本欧美视频| 成人精品久久久| 一区二区三区动漫| 欧美高清性猛交| 亚洲美女性生活视频| 激情亚洲一区二区三区四区| 欧美自拍大量在线观看| 91精品国产91久久| 日韩精品在线观看一区|