2012-09-29 27 views
2

當我使用這個phpcode下載一個文件的300KB/s的downloadspeed我用這個:PHP-Downloadscript - 下載限制doesn't工作

function readfile_chunked($dl_link, $filesize_file) { 
    $chunksize = 300*1024; #Buffersize in Byte 
    $data = ''; 
    $handle = fopen($dl_link, 'rb'); 
    while (!feof($handle)) { 
     $data = fread($handle, $chunksize); 
     sleep(1); 
     print $data; 
     @ob_flush(); 
     @flush(); 
    } 
    fclose($handle); 
} 

但doesn't工作! :-(

當我開始下載,速度下一個KB/s和它打破,然後恢復,等等。

當我脫下這個「睡眠(1)」中的代碼上面,然後下載開始,一切都很好,但與全速運行 - >邏輯

這是爲什麼

+0

'$ dl_link'是一個本地文件嗎?什麼是'$ filesize_file'?你發送正確的下載頭文件嗎?另外,你是從本地主機還是合適的服務器測試這個?嘗試刪除錯誤抑制運算符('@')以查看是否顯示任何錯誤。 –

+1

如果你有Linux,可以嘗試'curl http:// whatever/script.php'。它會顯示是否刷新輸出緩衝區。 –

+0

當我在'flush()'之後放入'sleep(1)'時,速度爲8,5kb/s。 '$ dl_link'是一個遠程文件,具有從另一個服務器直接http下載鏈接。 '$ filesize_file'僅在此函數中作爲信息使用,並且在此代碼中沒有任何函數。 –

回答

2

這看起來大多不錯,但嘗試以下方法:!?

function readfile_chunked($path, $speed) 
{ 
    if (is_file($path) !== true) 
    { 
     exit('not a local file'); 
    } 

    header('Pragma: public'); 
    header('Cache-Control: public, no-cache'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Length: ' . filesize($path)); 
    header('Content-Disposition: attachment; filename="' . basename($path) . '"'); 
    header('Content-Transfer-Encoding: binary'); 

    $handle = fopen($path, 'rb'); 

    while (!feof($handle)) 
    { 
     echo fread($handle, $speed * 1024); sleep(1); 

     while (ob_get_level() > 0) 
     { 
      ob_end_flush(); 
     } 

     flush(); 
    } 

    fclose($handle); 
} 

readfile_chunked('/path/to/your/file.ext', 300); 
+0

下載速度爲8,0KB/s,並且帶有本地文件。 :-( –

+0

@MaxGunter:不知道那麼,試着提供一些更詳細的信息,或許是一個我們可以測試的實時URL。你是否說下載暫停並繼續?這應該不會發生只有這些標題。 –

0

您可能首先嚐試添加@ob_flush_end()以禁用輸出緩衝,並在循環中刪除@ob_flush()。延遲可能是由於輸出緩衝。

您也可以嘗試用echo代替print。你可能會獲得一些性能提升。

也嘗試一個較小的塊並使用usleep來代替較短的延遲時間。

+0

它doesn' :T工作,太:( 這裏試試吧: http://tinyurl.com/d62z9qr 這裏相同的代碼沒有'睡眠(1)': http://tinyurl.com/c9tkekt –

+0

你看到每個塊的延遲是4秒...嘗試我的新建議? –