2009-12-06 137 views
0

在我的網站上,用戶可以輸入文件鏈接,我可以通過我的服務器將下載過程流式傳輸給他們。我使用這樣的系統:PHP下載問題

header('Cache-control: private'); 
header('Content-Type: application/octet-stream'); 
header('Content-Length: ' . $r[2]); 
header('Content-Disposition: filename=' . $theName); 

flush(); 

$file = fopen($fileName, "r"); 
while(!feof($file)) 
{ 
    print fread($file, 10240); 
    flush(); 
    sleep(1); 
} 
fclose($fileName); 

想到的是,我的用戶下載速度很慢(600kb/s)。這個託管的服務器位於1Gbit端口上,因此他們應該將他們的互聯網連接擴大10倍。

我想知道是否有更好的方法來做這種事情,也許捲曲也許?我沒有很多CURL的經驗,但我會很感激任何反饋。

謝謝。

+0

嘗試打印一些靜態字符串(在循環或其他)而不是從文件讀取。這將幫助您確定磁盤訪問是否是問題的原因。 – Aziz 2009-12-06 20:31:13

+0

我認爲他是從用戶指定的遠程服務器獲取實時數據。 – 2009-12-06 20:36:14

回答

2

使用readfile

如果你要堅持自己的做法,那麼這將是更有效的這種方式,無需沖洗而睡:

while(!feof($file)) { 
    print fread($file, 10240); 
} 

爲什麼這裏的:

  • 在使用沖洗()可以防止正常的緩衝區功能,並且使用睡眠(1)可以通過每10個KiBs暫停1秒來有效地降低傳輸速度。
1

我真的不知道你在這裏做什麼..不明白爲什麼你需要這個循環,特別是不明白爲什麼你需要睡眠()..你應該只使用readfile或類似的東西,而不是循環,這將是非常有效的

你怎麼看捲曲會幫助你?

+0

我沒有注意到睡眠,+1 – 2009-12-06 20:35:44

1

如果不是@Sabeen Malik指出的一秒鐘睡眠時間(),這很可能是由於您的Web提供者(例如使用mod_throttle或mod_bandwidth)或Web提供者施加的服務器端限制從中獲取數據。