curl能否下載115的資源
1個300MB的資源,用迅雷下載(非115VIP),已經設定了原始線程1,但是平均速度只有10幾KB,下到60%之時就提示錯誤。分析了一下URL地址規律,發現URL裡的 &t=1368261625 是一個變數,估計115根據這個時間來處理下載到期事務。
用 Ultraediter 開啟.td.cfg,修改了裡面的&t=1368261625為目前時間,重新啟動迅雷,發現檔案被重新下載了(之前的60%木有了)。不知道如何修改迅雷,才可以使得修改了下載URL後可以繼續前面的下載。(迅雷應該還有一個檔案參數對比的方法,但是沒有找到)
於是想到了用php curl下載115的資源(PHP可以任意修改URL地址),但是PHP的預設逾時為30秒,如果set_time_limit(0);的話,如何判別115的資源地址已經失效,即這個PHP檔案已經運行完畢?
打算用.bat檔案,或者直接命令提示字元DOS運行該php指令碼。
問題:
1.用curl斷點儲存檔案,會不會在第二次下載時,又重新從0%開始?
2.如果問題1可行的話,如果如何寫代碼,可以在一個長串連後,獲知該PHP檔案已經運行完畢?(這樣重新運行.bat或者DOS進行斷點下載)
PS:網上只有115上傳類的代碼,木有下載類的代碼,大蝦們幫忙挑戰一下,可能的話,就是原創+精華帖,可以拿到CSDN部落格裡。
分享到:
------解決方案--------------------
忽略掉你其他的內容,只問一句:
既然打算用命令列,為何還要php載入curl?直接用curl.exe不就可以了嗎?
------解決方案--------------------
我跟你說說續傳的原理,你自己想想能不能完成吧
http續傳,少不了http要求標頭參數
Range:bytes=aaaa-bbbb/cccc
回應標頭也一定有 Content-Length
aaaa為開始位置,bbbb為結束位置,cccc是檔案長度
多線程其實就是把檔案切片了,發送N個請求,每個aaaa和bbbb指向不同的段,然後拼接
續傳就是把aaaa設在已寫入硬碟的檔案的位置,繼續下載
多線程+續傳,一般需要一個記錄,記下每個切片的完成位置,等等
所以續傳必須滿足三方:用戶端能發送range,proxy是串連機制而不是轉寄機制,伺服器能接受range請求
如果你用工具下載,一般,工具不會考慮太多,記錄檔案必然對應一個url和一個本地檔案
當url改變時,工具很難“智能”地選擇之前的記錄檔案去確認已下載部分
另一方面如果多線程不是採用預寫硬碟的方式就更麻煩了
自己寫個socket或者能做到
另外,/M00/07/9C/d5NjH05TqRMAAAAAF2WEJGZScDk3421731/ 這樣的路徑,憑經驗基本可以確認是臨時路徑,伺服器對它的處理方式很難預料,刪除or禁止訪問or……?
------解決方案--------------------
你那個url不支援斷點續傳!
我貼段測試代碼,供你研究。但要達到實用還很要花點功夫
$url = 'http://blog.51edm.org/content/uploadfile/201303/dc7f1364286796.zip';
function curl_get($durl) {
$cookiejar = realpath('cookie.txt');
$t = parse_url($durl);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$durl);
// curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RANGE, '0-300'); //從 0 位移起取 301 的位元組
// curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_TIMEOUT,5);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_REFERER, "http://$t[host]/");
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiejar);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'head_func');
curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function");
$r = curl_exec($ch);
curl_close($ch);
return $r;
}
echo '';<br />curl_get($url);<br /><br />//回呼函數 $str 為讀到的內容<br />function progress_function($ch,$str) {<br />//print_r(curl_getinfo($ch));<br /> echo PHP_EOL, strlen($str);//,':',substr($str,0,20);<br /> return strlen($str);<br />}<br />//回呼函數,用於獲得頭資訊<br />function head_func($ch, $str) {<br />echo $str;<br /> return strlen($str);<br />}<br /></pre><br />頭資訊中類似<br />Content-Length: 301 <li ><i class="layui-icon">