PHP下载大文件失败并限制下载速度的实例代码


Posted in PHP onMay 10, 2019

1.问题:

PHP在使用readfile函数定义下载文件时候,文件不可以过大,否则会下载失败,文件损坏且不报错;

2.原因:

这个是因为readfile读取文件的时候会把文件放入缓存,导致内存溢出;

3.解决:分段下载,并限制下载速度;

<?php
//设置文件最长执行时间
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');
  // 设置指针位置
  fseek($fp, 0);

  // 开启缓冲区
  ob_start();
  // 分段读取文件
  while (!feof($fp)) {
    $chunk_size = 1024 * 1024 * 2; // 2MB
    echo fread($fp, $chunk_size);
    ob_flush(); // 刷新PHP缓冲区到Web服务器
    flush(); // 刷新Web服务器缓冲区到浏览器
    sleep(1); // 每1秒 下载 2 MB
  }
  // 关闭缓冲区
  ob_end_clean();
  fclose($fp);
} else {
  echo 'file not exists or has been removed!';
}
exit();

总结

以上所述是小编给大家介绍的PHP下载大文件失败并限制下载速度的实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

PHP 相关文章推荐
PHPMailer 中文使用说明小结
Jan 22 PHP
php下用cookie统计用户访问网页次数的代码
May 09 PHP
PHP获取MAC地址的函数代码
Sep 11 PHP
PHP代码网站如何防范SQL注入漏洞攻击建议分享
Mar 01 PHP
thinkphp中session和cookie无效的解决方法
Dec 19 PHP
PHP模拟asp中response类实现方法
Aug 08 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 PHP
PHP页面跳转实现延时跳转的方法
Dec 10 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
Oct 22 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
Jan 23 PHP
详解php伪造Referer请求反盗链资源
Jan 24 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
Feb 11 PHP
PHP 7.4 新语法之箭头函数实例详解
May 09 #PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 #PHP
php使用mysqli和pdo扩展,测试对比mysql数据库的执行效率完整示例
May 09 #PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
May 09 #PHP
PHP CURL中传递cookie的方法步骤
May 09 #PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
May 09 #PHP
Laravel配置全局公共函数的方法步骤
May 09 #PHP
You might like
PHP与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
php实现MySQL数据库备份与还原类实例
2014/12/09 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
详解js中的apply与call的用法
2016/07/30 Javascript
JavaScript中值类型和引用类型的区别
2017/02/23 Javascript
Angular 2.x学习教程之结构指令详解
2017/05/25 Javascript
详解vue-cli 脚手架项目-package.json
2017/07/04 Javascript
vue router下的html5 history在iis服务器上的设置方法
2017/10/18 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
详解vue使用vue-layer-mobile组件实现toast,loading效果
2018/08/31 Javascript
nodejs 使用 js 模块的方法实例详解
2018/12/04 NodeJs
Python GAE、Django导出Excel的方法
2008/11/24 Python
python将图片文件转换成base64编码的方法
2015/03/14 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
Python之日期与时间处理模块(date和datetime)
2017/02/16 Python
基于Python os模块常用命令介绍
2017/11/03 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
Python random模块用法解析及简单示例
2017/12/18 Python
Python模拟简单电梯调度算法示例
2018/08/20 Python
tensorflow实现在函数中用tf.Print输出中间值
2020/01/21 Python
opencv python如何实现图像二值化
2020/02/03 Python
Python之变量类型和if判断方式
2020/05/05 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
canvas里面如何基于随机点绘制一个多边形的方法
2018/06/13 HTML / CSS
印尼穆斯林时尚购物网站:Hijabenka
2016/12/10 全球购物
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
Eagle Eyes Optics鹰眼光学:高性能太阳镜
2018/12/07 全球购物
国际贸易专业推荐信
2013/11/15 职场文书
运动会广播稿20字
2014/02/18 职场文书
公共场所禁烟标语
2014/06/25 职场文书
职位证明模板
2015/06/23 职场文书
茶花女读书笔记
2015/06/29 职场文书
nginx.conf配置文件结构小结
2022/04/08 Servers