2012-10-21 116 views
3

我需要php腳本來從url下載可恢復文件到服務器。它應該能夠開始下載,然後當它快照(30秒-5分鐘)恢復時,以此類推直到它完成整個文件。用php curl下載大文件塊

perl http://curl.haxx.se/programs/download.txt有類似的東西,但我想用php做,我不知道perl。

我認爲使用CURLOPT_RANGE下載塊和fopen($fileName, "a")將它追加到服務器上的文件。

這裏是我的嘗試:

<?php 

function run() 
{ 
    while(1) 
    { 
     get_chunk($_SESSION['url'], $_SESSION['filename']); 
     sleep(5); 
     flush(); 
    }  
} 

function get_chunk($url, $fileName) 
{ 

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    if (file_exists($fileName)) { 
     $from = filesize($fileName); 
     curl_setopt($ch, CURLOPT_RANGE, $from . "-");//maybe "-".$from+1000 for 1MB chunks 
    } 

    $fp = fopen($fileName, "a"); 
    if (!$fp) { 
     exit; 
    } 
    curl_setopt($ch, CURLOPT_FILE, $fp); 
    $result = curl_exec($ch); 
    curl_close($ch); 

    fclose($fp); 

} 

?> 
+0

這會有所幫助。 http://stackoverflow.com/questions/2032924/how-to-partially-download-a-remote-file-with-curl – kpotehin

回答

0

如果您的目的是下載一個文件在片狀連接,curl--retry標誌自動重試下載在錯誤的情況下,繼續離開的地方。不幸的是它似乎是PHP library is missing that option,因爲libcurl is also missing that option

通常,我建議使用庫而不是外部命令,但不要自己滾動,在這種情況下,可以更簡單地在命令行上調用curl --retrycurl -C -。另一種選擇是wget -c

否則我沒有看到需要總是以塊的形式獲取數據。儘可能地下載,如果使用CURLOPT_RANGE恢復錯誤並且文件大小與現在一樣。

+0

謝謝。 ____________________ –