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 代码优化之经典示例
Mar 24 PHP
php字符串分割函数explode的实例代码
Feb 07 PHP
深入Memcache的Session数据的多服务器共享详解
Jun 13 PHP
php实现按指定大小等比缩放生成上传图片缩略图的方法
Dec 15 PHP
制作安全性高的PHP网站的几个实用要点
Dec 30 PHP
Zend Framework教程之Resource Autoloading用法实例
Mar 08 PHP
php生成验证码,缩略图及水印图的类分享
Apr 07 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
Sep 30 PHP
php断点续传之文件分割合并详解
Dec 13 PHP
php中的异常和错误浅析
May 03 PHP
php实现基于pdo的事务处理方法示例
Jul 21 PHP
PHP迭代器接口Iterator用法分析
Dec 28 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 上传文件的方法(类)
2009/07/30 PHP
php页面消耗内存过大的处理办法
2013/03/18 PHP
ThinkPHP的I方法使用详解
2014/06/18 PHP
PHP把数字转成人民币大写的函数分享
2014/06/30 PHP
php微信公众平台开发(四)回复功能开发
2016/12/06 PHP
PHP实现网站访问量计数器
2017/10/27 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
JavaScript获取网页中第一个链接ID的方法
2015/04/03 Javascript
jquery实现全选、反选、获得所有选中的checkbox
2020/09/13 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
2017/01/20 Javascript
js实现日期显示的一些操作(实例讲解)
2017/07/27 Javascript
解决Vue编译时写在style中的路径问题
2017/09/21 Javascript
jquery实现楼层滚动效果
2018/01/01 jQuery
JS在Array数组中按指定位置删除或添加元素对象方法示例
2019/11/19 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
react结合bootstrap实现评论功能
2020/05/30 Javascript
[04:48]DOTA2上海特锦赛小组赛第三日 TOP10精彩集锦
2016/02/28 DOTA
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
Python爬取附近餐馆信息代码示例
2017/12/09 Python
Django渲染Markdown文章目录的方法示例
2019/01/02 Python
python实现PID算法及测试的例子
2019/08/08 Python
python数字类型math库原理解析
2020/03/02 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
Kmeans均值聚类算法原理以及Python如何实现
2020/09/26 Python
canvas离屏技术与放大镜实现代码示例
2018/08/31 HTML / CSS
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
将n个数按输入顺序的逆序排列,用函数实现
2012/11/14 面试题
写出SQL四条最基本的数据操作语句(DML)
2012/12/12 面试题
nginx简单配置多个server的方法
2021/03/31 Servers
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
TensorFlow的自动求导原理分析
2021/05/26 Python