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 相关文章推荐
不用iconv库的gb2312与utf-8的互换函数
Oct 09 PHP
php的正则处理函数总结分析
Jun 20 PHP
一个PHP数组应该有多大的分析
Jul 30 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
Oct 15 PHP
php的大小写敏感问题整理
Dec 29 PHP
php页面跳转代码 输入网址跳转到你定义的页面
Mar 28 PHP
php数组(array)输出的三种形式详解
Jun 05 PHP
Joomla框架实现字符串截取的方法示例
Jul 18 PHP
浅谈Yii乐观锁的使用及原理
Jul 25 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
Oct 22 PHP
解决PHPstudy Apache无法启动的问题【亲测有效】
Oct 30 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简单命令代码集锦
2007/09/24 PHP
php设计模式 Command(命令模式)
2011/06/26 PHP
PHP如何利用P3P实现跨域
2013/08/24 PHP
我遇到的参数传递中 双引号单引号嵌套问题
2010/02/11 Javascript
Jquery提交表单 Form.js官方插件介绍
2012/03/01 Javascript
JavaScript通过RegExp实现客户端验证处理程序
2013/05/07 Javascript
关于IE中getElementsByClassName不能用的问题解决方法
2013/08/26 Javascript
js+html5实现可在手机上玩的拼图游戏
2015/07/17 Javascript
AngularJS 表达式详细讲解及实例代码
2016/07/26 Javascript
简单实现JS倒计时效果
2016/12/23 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
基于vue2.0动态组件及render详解
2018/03/17 Javascript
ES6的Fetch异步请求的实现方法
2018/12/07 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
python发送arp欺骗攻击代码分析
2014/01/16 Python
Python实现约瑟夫环问题的方法
2016/05/03 Python
Python 3中的yield from语法详解
2017/01/18 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
python try except 捕获所有异常的实例
2018/10/18 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
2019/02/22 Python
python使用pymongo操作mongo的完整步骤
2019/04/13 Python
python提取xml里面的链接源码详解
2019/10/15 Python
基于tensorflow for循环 while循环案例
2020/06/30 Python
如何用 Python 制作 GitHub 消息助手
2021/02/20 Python
pandas apply使用多列计算生成新的列实现示例
2021/02/24 Python
Html5新增标签与样式及让元素水平垂直居中
2019/07/11 HTML / CSS
Richards网上商店:当代时尚,遍布巴西
2019/11/03 全球购物
EJB需直接实现它的业务接口或Home接口吗,请简述理由
2016/11/23 面试题
2014年纪检部工作总结
2014/11/12 职场文书
Python的这些库,你知道多少?
2021/06/09 Python
python四种出行路线规划的实现
2021/06/23 Python
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript