解决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时,它会立即开始下载文件并放到内存中,如果文件过大,有可能导致内存不足 ...
随机推荐
- 2022年官网下安装NodeJS最全版与官网查阅方法
目录 安装部署NodeJS 1.百度搜索NodeJS. 2.选择下载,windows版,选择64位下载 3.找到本地安装包位置,双击打开 4.选择同意,点击下一步 5.选择安装目录,点击下一步 6.选 ...
- 面试官:Redis中的缓冲区了解吗
hello 大家好,我是七淅(xī). Redis 大家肯定不陌生,但在使用层面看不到的地方,就容易被忽略.今天想和大家分享的内容是 Redis 各个缓冲区的作用.溢出的后果及优化方向. 在开始正文前 ...
- docker 部署mysql tomcat时 在root@localhost~下——-——docker exec -it 容器名 /bin/bash 报错
在docker部署mysql时 报错 找不到 容器不自动启动 , docker start 容器名 也没有效果 多次尝试发现 原因是创建容器时在 下面创建的 更改为下创建 问题解决
- 报错 ———— Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 2; columnNumber: 6; 不允许有匹配 "[xX][mM][lL]" 的处理指令目标。
报错 <?xml version="1.0" encoding="UTF-8"?> 必须是XML文件的第一个元素且前面不能空格. ### Erro ...
- web服务器-Nginx URL重写
web服务器-Nginx URL重写 一. URL重写介绍 和apache等web服务软件一样,rewrite的主要功能是实现URL地址的重定向.Nginx的rewrite功能需要PCRE软件的支持, ...
- 给windows右键添加快捷启动程序
给windows右键添加快捷启动程序 修改点击空白处的右键 运行--redegit 打开注册表 展开第一个H..C..R 找到 Direcory,展开 找到Background 展开 右键shell, ...
- GO后端开发+VUE实列
因为我是从java转到go,代码结构跟我之前用java的很像 在这里只浅显的实战运用,没有过多理论讲解 工作环境:IDE:Goland , Go 1.17.7 框架 Gin+Gorm ,前端VUE 这 ...
- Python 的排序方法 sort 和 sorted 的区别
使用 sort() 或内建函数 sorted() 对列表进行排序.它们之间的区别有两点: sort() 方法是对原列表进行操作,而 sorted() 方法会返回一个新列表,不是在原来的基础上进行操作. ...
- case 函数语法与使用
case 函数是聚合函数的一种,为统计函数. case表达式: CASE selector WHEN value1 THEN action1; WHEN value2 THEN action2; WH ...
- 100行代码实现HarmonyOS“画图”应用,eTS开发走起!
本期我们给大家带来的是"画图"应用开发者Rick的分享,希望能给你的HarmonyOS开发之旅带来启发~ 介绍 2021年的华为开发者大会(HDC2021)上,HarmonyOS ...