2013-02-01 46 views
5

我正在寫一個腳本,它將通過我的服務器將文件從網址流式傳輸給用戶。在目前的狀態下它有效,但速度很慢。通過PHP從互聯網流文件很慢

下面是相關代碼:

/* Bytes per second */ 
define('TRANSFER_CAP', 1048576); 

/* Hard part... stream the file to the user */ 
header('Content-Description: File Transfer'); 
header('Content-Disposition: attachment; filename=' . $filename); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Length: ' . $filesize); 

$file = fopen($fileLocation, 'rb'); 
if(!$file) { 
    // TODO: handle errors 
} 

while(!feof($file)) { 
    echo fread($file, TRANSFER_CAP/2); 
    ob_flush(); 
    flush(); 

    /* Limit the download speed by sleeping */ 
    usleep(500); 
} 

這個腳本是我的本地機器上運行。當我在瀏覽器中請求文件時(不通過腳本),我獲得了大約2.5MB/s的固定下載速度,這是我的互聯網最高速度。但是,如果我運行該腳本並嘗試下載相同的文件,則只能獲得約240-250KB/s。

我知道這不是限制傳輸速度的腳本,因爲我已將它設置爲1MB/s。我也想不出在這個腳本中會產生很大的開銷,這會降低速度。

編輯:一些有趣的,如果我這樣做與readfile()相反,我得到幾乎我的全部下載速度:

readfile('http://cachefly.cachefly.net/100mb.test'); 

所以它必須使用fopenfread的問題嗎?

+0

是你的上傳速度與你下載的一樣嗎?在世界上很多地方他們都不是。你可以http://speedtest.net來測試。 – 2013-02-01 01:39:49

+0

這不是,但我沒有在這個腳本中進行任何上傳。我只是簡單地下載文件,但由於某種原因,它比我直接通過瀏覽器下載文件要慢很多。 –

+0

對不起,誤會了。如果它不是一個大文件,請嘗試\t file_get_contents()代替 – 2013-02-01 01:44:47

回答

0

爲什麼你不只是做一個HTTP頭重定向到二進制文件本身?這樣你就可以將PHP從等式中排除在外,因爲所有你想要做的就是提供文件。

+0

如果我打算這樣做,我只是直接鏈接到文件下載,而不是通過PHP腳本。我需要這樣做,原因有幾個,包括監控用戶下載的數量,這樣做意味着我可以「計算字節數」並獲得準確的總數。 –

+0

爲什麼不從PHP中進行某種「包含」來發送二進制數據,而不是以塊的形式讀取和發送數據?只是大聲思考。 –