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 相关文章推荐
程序员编程十条戒律
Jul 09 PHP
PHP自动选择 连接本地还是远程数据库
Dec 02 PHP
PHP 关于访问控制的和运算符优先级介绍
Jul 08 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
Jun 12 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
Aug 18 PHP
PHP反射机制用法实例
Aug 28 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
Nov 19 PHP
微信公众平台消息接口校验与消息接口响应实例
Dec 23 PHP
php源码分析之DZX1.5随机数函数random用法
Jun 17 PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 PHP
Mac系统下安装PHP Xdebug
Mar 30 PHP
php识别翻转iphone拍摄的颠倒图片
May 17 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批量去除BOM头代码分享
2015/06/26 PHP
深入理解PHP原理之执行周期分析
2016/06/01 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
javascript多种数据类型表格排序代码分析
2010/09/11 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
jquery div拖动效果示例代码
2013/12/08 Javascript
jQuery使用before()和after()在元素前后添加内容的方法
2015/03/26 Javascript
js 判断登录界面的账号密码是否为空
2017/02/08 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
详解webpack编译多页面vue项目的配置问题
2017/12/11 Javascript
详解Angular5路由传值方式及其相关问题
2018/04/28 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
javascript对HTML字符转义与反转义
2018/12/13 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
python获取远程图片大小和尺寸的方法
2015/03/26 Python
用Python的线程来解决生产者消费问题的示例
2015/04/02 Python
selenium+python截图不成功的解决方法
2019/01/30 Python
查看python安装路径及pip安装的包列表及路径
2019/04/03 Python
python实现扫描局域网指定网段ip的方法
2019/04/16 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
Django发送邮件功能实例详解
2019/09/02 Python
python实现超市管理系统(后台管理)
2019/10/25 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
2021/01/27 Python
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
优质有机椰子产品:Dr. Goerg
2019/09/24 全球购物
Gerry Weber德国官网:优质女性时装,德国最大的时装公司之一
2019/11/02 全球购物
大学军训决心书
2015/02/05 职场文书
债务追讨律师函
2015/06/24 职场文书
position:sticky 粘性定位的几种巧妙应用详解
2021/04/24 HTML / CSS
MySQL 使用事件(Events)完成计划任务
2021/05/24 MySQL
如何Tomcat中使用ipv6地址
2022/05/06 Servers