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面向对象编程快速入门
Oct 09 PHP
PHP4实际应用经验篇(7)
Oct 09 PHP
Linux下ZendOptimizer的安装与配置方法
Apr 12 PHP
php面向对象全攻略 (八)重载新的方法
Sep 30 PHP
上传文件先创建目录 再上传到目录里面去
Dec 29 PHP
9个实用的PHP代码片段分享
Jan 22 PHP
PHP排序算法类实例
Jun 17 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 PHP
php5.6.x到php7.0.x特性小结
Aug 17 PHP
Laravel使用原生sql语句并调用的方法
Oct 09 PHP
在Laravel中使用MongoDB的方法示例
Nov 11 PHP
PHP并发场景的三种解决方案代码实例
Feb 27 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中HTTP_REFERER函数用法实例
2014/11/21 PHP
js 调整select 位置的函数
2008/02/21 Javascript
javascript cookies操作集合
2010/04/12 Javascript
jQuery中filter()和find()的区别深入了解
2013/09/25 Javascript
javascript模拟map输出与去除重复项的方法
2015/02/09 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
Jquery全屏相册插件zoomvisualizer具有调节放大与缩小功能
2015/11/02 Javascript
SelecT下拉框选中和取值的解决方法
2016/11/22 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
javaScript嗅探执行神器-sniffer.js
2017/02/14 Javascript
使用 Node.js 对文本内容分词和关键词抽取
2017/05/27 Javascript
javascript将list转换成树状结构的实例
2017/09/08 Javascript
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
Vue实现简单计算器案例
2020/02/25 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
2020/06/05 Javascript
python对字典进行排序实例
2014/09/25 Python
Python set集合类型操作总结
2014/11/07 Python
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
使用python实现rsa算法代码
2016/02/17 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
python实现K近邻回归,采用等权重和不等权重的方法
2019/01/23 Python
python实现学员管理系统
2019/02/26 Python
python 如何调用远程接口
2020/09/11 Python
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
巧克力领导品牌瑞士莲美国官网:Lindt Chocolate美国
2016/08/25 全球购物
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
一套VC试题
2015/01/23 面试题
哪些情况下不应该使用索引
2015/07/20 面试题
安全标准化实施方案
2014/02/20 职场文书
银行职员自我鉴定
2014/04/20 职场文书
市级三好学生事迹材料
2014/08/27 职场文书
新郎新娘答谢词
2015/01/04 职场文书
刘胡兰观后感
2015/06/16 职场文书
详解Mysql事务并发(脏读、不可重复读、幻读)
2022/04/29 MySQL