解决PHP下载大文件失败,并限制下载速度
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();复制代码
转载于:https://juejin.im/post/5cd445866fb9a031f10ca672
解决PHP下载大文件失败,并限制下载速度的更多相关文章
- 记PHP下载大文件失败的一次坑
		说明 php提供文件的储存和下载,nginx作为web服务器,fpm做解析. 现象 当下载一个5M大小的图片时,总提示下载失败,或下载下来的文件不完整,仅显示部分图像(每次下载不一样) php下载相关 ... 
- github下载大文件太慢/失败
		场景 github下载大文件,使用浏览器下载zip包到本地在下载到1G时失败, 使用 git clone ssh下载速度20k/s以下,已fq. 解决方法(亲测) 1.下载Github Desktop ... 
- 转(Response.WriteFile 无法下载大文件解决方法)
		以前用Response.WriteFile(filename),但当遇到大文件时无法完整下载. 该方法最大的问题,它不是直接将数据抛到客户端,而是在服务器端(IIS)上缓存.当下载文件比较大时,服务器 ... 
- Android 开发工具类 27_多线程下载大文件
		多线程下载大文件时序图 FileDownloader.java package com.wangjialin.internet.service.downloader; import java.io.F ... 
- [libcurl]_[0基础]_[使用libcurl下载大文件]
		场景: 1. 在Windows编程时, 下载http页面(html,xml)能够使用winhttp库,可是并非非常下载文件,由于会失败. 由此引出了WinINet库,无奈这个库的稳定性比較低,使用样例 ... 
- Loadrunner上传文件解决办法(大文件)
		Loadrunner上传文件解决办法(大文件) 最近再做一个跟海量存储相关的项目测试,需要通过LR模拟用户大量上传和下载文件,请求是Rest或Soap,同时还要模拟多种大小尺寸不一的文件 通常情况下, ... 
- DBeaver下载驱动文件失败
		今天首次使用DBeaver软件链接数据库时会进行下载驱动文件,例如如下图所示: 在上图中显示了下载驱动文件失败,提示“无法解决库文件,请检查网络设置”.其实,是可以正常上网的,可能是公司内网的限制,或 ... 
- python下载大文件
		1. wget def download_big_file_with_wget(url, target_file_name): """ 使用wget下载大文件 Note: ... 
- python 下载大文件
		当使用requests的get下载大文件/数据时,建议使用使用stream模式. 当把get函数的stream参数设置成False时,它会立即开始下载文件并放到内存中,如果文件过大,有可能导致内存不足 ... 
随机推荐
- 移动端开发为什么使用@2x@3x图片
			物理.逻辑与位图像素的概念 关于设备物理像素和逻辑像素,这两个像素一个是实体的,一个是抽象的单位.除此之外还有一个不可忽视的像素,就是位图像素. 物理像素(设备像素):指的是设备屏幕实际拥有的像素点. ... 
- 使用socat反向Shell多台机器
			原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 场景 很多时候,我们需要批量操作多台机器,业界一般使用Ansible来实现,但使用Ansible来操作多台机器的前提是需 ... 
- Mybatis工具类(自动提交事务)
			public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { //获取工 ... 
- TypeError: put() missing 1 required positional argument: 'item'问题分析
			今天博主在练习带参数线程池的时候与到了如下问题: 翻译过来,就是缺少位置参数. 一.错误1 如果此时你的代码高亮是这样: 解决办法:在init魔法方法下的Queue没有加括号,即 self.q = Q ... 
- Flask Web开发读书笔记
			开篇:目前想自学Flask Web开发--基于Python,找了几本书准备啃啃,同时也会分享读书笔记.希望和大家一起进步. Flask是小型框架,可以算是微框架,但是他的功能还是比较多 Flask有三 ... 
- Java UDP 编程
			1.客户端代码 1 import java.io.IOException; 2 import java.net.DatagramPacket; 3 import java.net.DatagramSo ... 
- Spring系列26:Spring AOP 通知与顺序详解
			本文内容 如何声明通知 如何传递参数到通知方法中 多种通知多个切面的通知顺序 多个切面通知的顺序源码分析与图解 声明通知 Spring中有5种通知,通过对应的注解来声明: @BeforeBefore ... 
- JDBC快速入门(附Java通过jar包连接MySQL数据库)
			•通过jar包连接mysql数据库 •下载jar包 Java 连接 MySQL 需要驱动包,官网下载地址为MySQL驱动包官网下载,选择适合的jar包版本进行安装 (记得安装的地址,下面导入包时会用到 ... 
- 容器化 | 在 K8s 上部署 RadonDB MySQL Operator 和集群
			作者:程润科 数据库研发工程师 编辑:张莉梅 高级文档工程师 视频:钱芬 高级测试工程师 本文将演示在 Kubernetes 上部署 RadonDB MySQL Kubernetes 2.X(Oper ... 
- 开源电调blheli / blheli_s分析
			一. 启动阶段分析 启动阶段需完成24次换相,超过24次之后进入初始运行阶段,该阶段持续12次换相周期(每个周期6次换相),完成后进入正常运转阶段 二. 换相时间分析 总体思想是根据电机运行状态计算前 ... 
