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 相关文章推荐
Cakephp 执行主要流程
Mar 24 PHP
备份mysql数据库的php代码(一个表一个文件)
May 28 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
Oct 12 PHP
解析centos中Apache、php、mysql 默认安装路径
Jun 25 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
Jan 08 PHP
PHP实现基于文本的摩斯电码生成器
Jan 11 PHP
PHP面向对象程序设计实例分析
Jan 26 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
微信开发之php表单微信中自动提交两次问题解决办法
Jan 08 PHP
php解决安全问题的方法实例
Sep 19 PHP
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学习笔记之一
2011/01/17 PHP
详解WordPress中简码格式标签编写的基本方法
2015/12/22 PHP
PHP图形计数器程序显示网站用户浏览量
2016/07/20 PHP
Prototype Template对象 学习
2009/07/19 Javascript
jquery判断单个复选框是否被选中的代码
2009/09/03 Javascript
jquery checkbox实现单选小例
2013/11/27 Javascript
JavaScript生成福利彩票双色球号码
2015/05/15 Javascript
jQuery实现延迟跳转的方法
2015/06/05 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
2016/11/17 Javascript
jQuery居中元素scrollleft计算方法示例
2017/01/16 Javascript
用file标签实现多图文件上传预览
2017/02/14 Javascript
vue使用watch 观察路由变化,重新获取内容
2017/03/08 Javascript
jquery+ajax实现省市区三级联动 (封装和不封装两种方式)
2017/05/15 jQuery
JavaScript闭包_动力节点Java学院整理
2017/06/27 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
详解Node.js利用node-git-server快速搭建git服务器
2017/09/27 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
js实现随机8位验证码
2020/07/24 Javascript
Javascript前端下载后台传来的文件流代码实例
2020/08/18 Javascript
[43:35]EG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python的pandas工具包,保存.csv文件时不要表头的实例
2018/06/14 Python
Python实现的网页截图功能【PyQt4与selenium组件】
2018/07/12 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
2018/12/03 Python
浅谈Python 命令行参数argparse写入图片路径操作
2020/07/12 Python
一款利用纯css3实现的win8加载动画的实例分析
2014/12/11 HTML / CSS
CSS3径向渐变之大鱼吃小鱼之孤单的大鱼
2016/04/26 HTML / CSS
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
介绍一下Python下range()函数的用法
2013/11/07 面试题
西安夏日科技有限公司Java笔试题
2013/01/11 面试题
工作中个人的自我评价
2013/12/31 职场文书
统计专业自荐书
2014/07/06 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
会计求职简历自我评价
2015/03/10 职场文书
python+opencv实现目标跟踪过程
2022/06/21 Python