日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php使用curl下载指定大小的文件

發布時間:2025/3/18 php 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php使用curl下载指定大小的文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? 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?bodypublic?$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; }


轉載于:https://blog.51cto.com/byteh/1969809

總結

以上是生活随笔為你收集整理的php使用curl下载指定大小的文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 69av在线 | 美女一区二区三区四区 | 114国产精品久久免费观看 | 国产成年人 | 三年中文在线观看中文版 | 久久亚洲精品国产精品黑人v | 国产爱搞| a亚洲天堂 | 上海贵妇尝试黑人洋吊 | 久久看片| 尤物在线观看视频 | 麻豆视频黄色 | 欧美乱妇一区二区三区 | 狠狠干在线 | 国产午夜精品一区二区三区视频 | 日韩成人av在线播放 | 亚洲无人区码一码二码三码的含义 | 国产精品久久久久无码av色戒 | 久久高清一区 | 一个人在线观看www软件 | 伊人网站在线观看 | youjizz自拍| 99这里都是精品 | 91大神在线免费观看 | 国产成人亚洲精品无码h在线 | 久久精品影视 | 极品人妻videosss人妻 | 色婷婷视频在线 | 国产精品老女人 | 亚洲爱视频 | av大片在线观看 | 色爱av综合 | 婷婷丁香六月 | 国产精品一区在线播放 | 国产亚洲成av人片在线观看桃 | 69精品无码成人久久久久久 | 国产精品久久精品三级 | 精品国内自产拍在线观看视频 | 国产激情视频一区二区 | 亚洲综合精品一区 | 扒下小娇妻的内裤打屁股 | 婷婷色在线播放 | 一二三区在线视频 | 亚洲爱视频 | 成人国产视频在线观看 | 日日夜夜爱爱 | 在线播放91 | 波多野结av衣东京热无码专区 | 欧美三级又粗又硬 | 国产精品探花在线观看 | 极品久久久久久 | 亚洲免费视 | 亚洲社区一区二区 | 国产九色在线播放九色 | 亚洲免费视频一区二区 | 伊人久久综合视频 | 久久成人在线观看 | 欧美国产在线观看 | 91精产国品一二三区在线观看 | 少妇xxx | 吻胸摸激情床激烈视频 | 99热国产在线观看 | 色吊丝av中文字幕 | 日韩av激情| 欧美在线视频你懂的 | 天堂av免费| 欧美大片在线看免费观看 | 美女被日网站 | 少妇人妻偷人精品视频蜜桃 | 亚洲天堂2024 | 九九国产精品视频 | 欧美xxxx吸乳 | av不卡免费| 日韩av少妇 | 国产成人精品视频ⅴa片软件竹菊 | 中文字幕一区二区三区四区免费看 | 电影一区二区三区 | 精品毛片在线观看 | 在线观看日韩国产 | 午夜精品视频一区二区三区在线看 | 夜夜操网 | 日韩成人精品一区二区 | 亚洲无码久久久久 | 日韩亚洲欧美一区二区 | 韩日黄色片 | 国产精品久久777777毛茸茸 | 亚洲欧美综合精品久久成人 | a级片在线观看视频 | 亚洲欧美另类自拍 | 欧美黄色录像视频 | 国产jjizz一区二区三区视频 | 人人草人人 | 草久久av | 一级做a免费视频 | 国产无限制自拍 | 日本精品视频一区二区三区 | 91视频播放 | 亚洲成人av | 师生出轨h灌满了1v1 |