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 相关文章推荐
php GD绘制24小时柱状图
Jun 28 PHP
Discuz 模板语句分析及知识技巧
Aug 21 PHP
PHP 中关于ord($str)&amp;gt;0x80的详细说明
Sep 23 PHP
Zend Studio去除编辑器的语法警告设置方法
Oct 24 PHP
thinkphp的c方法使用示例
Feb 24 PHP
smarty模板引擎中自定义函数的方法
Jan 22 PHP
PHP嵌套输出缓冲代码实例
May 12 PHP
php parse_str() 函数的定义和用法
May 23 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 PHP
php头像上传预览实例代码
May 02 PHP
基于 Swoole 的微信扫码登录功能实现代码
Jan 15 PHP
PHP parse_ini_file函数的应用与扩展操作示例
Jan 07 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
Windows中安装Apache2和PHP4权威指南
2006/11/18 PHP
ajax在joomla中的原生态应用代码
2012/07/19 PHP
CI操作cookie的方法分析(基于helper类库)
2016/03/28 PHP
php上传图片类及用法示例
2016/05/11 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
2017/08/01 PHP
jquery 关键字“拖曳搜索”之“拖曳”以及 图片“提示自适应放大”效果 的实现
2010/04/18 Javascript
JQuery处理json与ajax返回JSON实例代码
2014/01/03 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
详解nodeJS中读写文件方法的区别
2017/03/06 NodeJs
带你了解session和cookie作用原理区别和用法
2017/08/14 Javascript
详解AngularJS跨页面传值(ui-router)
2017/08/23 Javascript
redux中间件之redux-thunk的具体使用
2018/04/17 Javascript
ng-events类似ionic中Events的angular全局事件
2018/09/05 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
详解关于element级联选择器数据回显问题
2019/02/20 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
vue 动态添加class,三个以上的条件做判断方式
2020/11/02 Javascript
深入理解NumPy简明教程---数组3(组合)
2016/12/17 Python
python利用requests库进行接口测试的方法详解
2018/07/06 Python
Python wxPython库Core组件BoxSizer用法示例
2018/09/03 Python
python得到一个excel的全部sheet标签值方法
2018/12/10 Python
Python中的延迟绑定原理详解
2019/10/11 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
详解H5本地储存Web Storage
2017/07/03 HTML / CSS
HTML5进度条特效
2014/12/18 HTML / CSS
Ray-Ban雷朋瑞典官方网站:全球领先的太阳眼镜品牌
2019/08/22 全球购物
什么是类的返射机制
2016/02/06 面试题
《三峡》教学反思
2014/03/01 职场文书
信息技术培训感言
2014/03/06 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
研究生导师推荐信
2014/09/06 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书