在開發過程中,遇到大文件下載需求時,使用PHP的readfile()函數雖然簡單,但對於超大文件,直接讀取整個文件輸出會導致內存佔用過高甚至溢出。因此,需要採用更高效的下載方案來保證程序穩定性和用戶體驗。
斷點續傳允許用戶在下載中斷後,可以從中斷位置繼續下載,無需重複下載已完成的部分。這不僅節省了帶寬,也提升了下載的可靠性和用戶滿意度,尤其在網絡環境不穩定時尤為重要。
首先,通過$_GET獲取客戶端傳入的文件路徑參數,並利用basename()函數提取文件名,避免目錄穿越等安全風險。
$file = $_GET['file'];
$filename = basename($file);
通過設置Content-Type為application/octet-stream ,告訴瀏覽器這是一個二進製文件流。同時設置Content-Disposition頭,指明附件下載和文件名。
根據請求頭中的HTTP_RANGE ,解析出下載起始位置,並使用fseek()調整文件指針,實現斷點續傳。
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $filename . '"');
if (isset($_SERVER['HTTP_RANGE'])) {
$range = $_SERVER['HTTP_RANGE'];
preg_match('/bytes=(\d+)-/', $range, $matches);
$start = intval($matches[1]);
fseek($file, $start);
}
通過循環讀取文件內容,每次讀取一定大小的緩衝區(例如4096字節),逐步輸出給瀏覽器,並刷新輸出緩衝,保證數據及時傳輸。
$buffer_size = 4096;
while (!feof($file)) {
echo fread($file, $buffer_size);
ob_flush();
flush();
}
通過上述方法,PHP可以高效支持超大文件的斷點續傳下載,解決了傳統readfile()函數在大文件處理上的不足。開發者還可以基於此實現下載進度顯示、限速控制等功能,進一步提升用戶體驗。
合理利用HTTP協議的Range頭和PHP文件操作函數,可以讓下載服務更加穩定與靈活,適合各種實際業務場景。