PHP下載大文件失敗并限制下載速度的實(shí)例代碼
1.問題:
PHP在使用readfile函數(shù)定義下載文件時(shí)候,文件不可以過大,否則會(huì)下載失敗,文件損壞且不報(bào)錯(cuò);
2.原因:
這個(gè)是因?yàn)閞eadfile讀取文件的時(shí)候會(huì)把文件放入緩存,導(dǎo)致內(nèi)存溢出;
3.解決:分段下載,并限制下載速度;
<?php
//設(shè)置文件最長(zhǎng)執(zhí)行時(shí)間
set_time_limit(0);
if (isset($_GET['filename']) && !empty($_GET['filename'])) {
$file_name = $_GET['filename'];
$file = __DIR__ . '/assets/' . $file_name;
} else {
echo 'what are your searching for?';
exit();
}
if (file_exists($file) && is_file($file)) {
$filesize = filesize($file);
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . $filesize);
header('Content-Disposition: attachment; filename=' . $file_name);
// 打開文件
$fp = fopen($file, 'rb');
// 設(shè)置指針位置
fseek($fp, 0);
// 開啟緩沖區(qū)
ob_start();
// 分段讀取文件
while (!feof($fp)) {
$chunk_size = 1024 * 1024 * 2; // 2MB
echo fread($fp, $chunk_size);
ob_flush(); // 刷新PHP緩沖區(qū)到Web服務(wù)器
flush(); // 刷新Web服務(wù)器緩沖區(qū)到瀏覽器
sleep(1); // 每1秒 下載 2 MB
}
// 關(guān)閉緩沖區(qū)
ob_end_clean();
fclose($fp);
} else {
echo 'file not exists or has been removed!';
}
exit();
總結(jié)
以上所述是小編給大家介紹的PHP下載大文件失敗并限制下載速度的實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
搭建PhpStorm+PhpStudy開發(fā)環(huán)境的超詳細(xì)教程
這篇文章主要介紹了搭建PhpStorm+PhpStudy開發(fā)環(huán)境的超詳細(xì)教程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
php中的雙引號(hào)與單引號(hào)的基本使用及區(qū)別
字符串是一個(gè)非常要的知識(shí),在開發(fā)中,有的使用單引號(hào),有的使用雙引號(hào),這個(gè)是有區(qū)別的,這篇文章主要介紹了php中的雙引號(hào)與單引號(hào)的基本使用,需要的朋友可以參考下2023-06-06
Laravel框架Eloquent ORM修改數(shù)據(jù)操作示例
這篇文章主要介紹了Laravel框架Eloquent ORM修改數(shù)據(jù)操作,結(jié)合實(shí)例形式詳細(xì)分析了laravel框架更新數(shù)據(jù)的兩種常見操作技巧,需要的朋友可以參考下2019-12-12
Symfony2創(chuàng)建頁(yè)面實(shí)例詳解
這篇文章主要介紹了Symfony2創(chuàng)建頁(yè)面的方法,結(jié)合實(shí)例形式分析了Symfony頁(yè)面創(chuàng)建的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-03-03

