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 相关文章推荐
构建简单的Webmail系统
Oct 09 PHP
PHP生成HTML静态页面实例代码
Aug 31 PHP
ThinkPHP采用模块和操作分析
Apr 18 PHP
如何在php中正确的使用json
Aug 06 PHP
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
Dec 25 PHP
递归删除一个节点以及该节点下的所有节点示例
Mar 19 PHP
PHP获取文件的MD5值并判断是否被修改的例子
Jun 19 PHP
php从字符串创建函数的方法
Mar 16 PHP
PHP如何通过AJAX方式实现登录功能
Nov 23 PHP
php中__toString()方法用法示例
Dec 07 PHP
PHP实现的登录页面信息提示功能示例
Jul 24 PHP
PHP文件上传小程序 适合初学者学习!
May 23 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数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
PHP 导出Excel示例分享
2014/08/18 PHP
php中文验证码实现方法
2015/06/18 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
JQUERY CHECKBOX全选,取消全选,反选方法三
2008/08/30 Javascript
用Javascript获取页面元素的具体位置
2013/12/09 Javascript
基于javascript的JSON格式页面展示美化方法
2014/07/02 Javascript
JavaScript实现自动生成网页元素功能(按钮、文本等)
2015/11/21 Javascript
React入门教程之Hello World以及环境搭建详解
2017/07/11 Javascript
vue 里面使用axios 和封装的示例代码
2017/09/01 Javascript
javascript数组定义的几种方法
2017/10/06 Javascript
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
对layui初始化列表的CheckBox属性详解
2019/09/13 Javascript
浅谈vue项目,访问路径#号的问题
2020/08/14 Javascript
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
Python和C/C++交互的几种方法总结
2017/05/11 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
Python List cmp()知识点总结
2019/02/18 Python
Python3.6+Django2.0以上 xadmin站点的配置和使用教程图解
2019/06/04 Python
简单了解python的内存管理机制
2019/07/08 Python
Python3 使用pillow库生成随机验证码
2019/08/26 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
python生成特定分布数的实例
2019/12/05 Python
Python序列类型的打包和解包实例
2019/12/21 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
2020/03/01 Python
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
给领导的致歉信范文
2014/01/13 职场文书
英语老师推荐信
2014/02/26 职场文书
文艺晚会主持词
2014/03/24 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
基层党支部承诺书
2015/04/30 职场文书
浅析Python实现DFA算法
2021/06/26 Python
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers