我正在寫一個腳本,它將通過我的服務器將文件從網址流式傳輸給用戶。在目前的狀態下它有效,但速度很慢。通過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');
所以它必須使用fopen
和fread
的問題嗎?
是你的上傳速度與你下載的一樣嗎?在世界上很多地方他們都不是。你可以http://speedtest.net來測試。 – 2013-02-01 01:39:49
這不是,但我沒有在這個腳本中進行任何上傳。我只是簡單地下載文件,但由於某種原因,它比我直接通過瀏覽器下載文件要慢很多。 –
對不起,誤會了。如果它不是一個大文件,請嘗試\t file_get_contents()代替 – 2013-02-01 01:44:47