1.问题: PHP在使用readfile函数定义下载文件时候,文件不可以过大,否则会下载失败,文件损坏且不报错;

2.原因: 这个是因为readfile读取文件的时候会把文件放入缓存,导致内存溢出;

3.解决:分段下载,并限制下载速度;

  1.  
    <?php
  2.  
    //设置文件最长执行时间
  3.  
    set_time_limit(0);
  4.  
     
  5.  
    if (isset($_GET['filename']) && !empty($_GET['filename'])) {
  6.  
    $file_name = $_GET['filename'];
  7.  
    $file = __DIR__ . '/assets/' . $file_name;
  8.  
    } else {
  9.  
    echo 'what are your searching for?';
  10.  
    exit();
  11.  
    }
  12.  
     
  13.  
    if (file_exists($file) && is_file($file)) {
  14.  
    $filesize = filesize($file);
  15.  
    header('Content-Description: File Transfer');
  16.  
    header('Content-Type: application/octet-stream');
  17.  
    header('Content-Transfer-Encoding: binary');
  18.  
    header('Accept-Ranges: bytes');
  19.  
    header('Expires: 0');
  20.  
    header('Cache-Control: must-revalidate');
  21.  
    header('Pragma: public');
  22.  
    header('Content-Length: ' . $filesize);
  23.  
    header('Content-Disposition: attachment; filename=' . $file_name);
  24.  
     
  25.  
    // 打开文件
  26.  
    $fp = fopen($file, 'rb');
  27.  
    // 设置指针位置
  28.  
    fseek($fp, 0);
  29.  
     
  30.  
    // 开启缓冲区
  31.  
    ob_start();
  32.  
    // 分段读取文件
  33.  
    while (!feof($fp)) {
  34.  
    $chunk_size = 1024 * 1024 * 2; // 2MB
  35.  
    echo fread($fp, $chunk_size);
  36.  
    ob_flush(); // 刷新PHP缓冲区到Web服务器
  37.  
    flush(); // 刷新Web服务器缓冲区到浏览器
  38.  
    sleep(1); // 每1秒 下载 2 MB
  39.  
    }
  40.  
    // 关闭缓冲区
  41.  
    ob_end_clean();
  42.  
    fclose($fp);
  43.  
    } else {
  44.  
    echo 'file not exists or has been removed!';
  45.  
    }
  46.  
     
  47.  
    exit();复制代码

转载于:https://juejin.im/post/5cd445866fb9a031f10ca672

解决PHP下载大文件失败,并限制下载速度的更多相关文章

  1. 记PHP下载大文件失败的一次坑

    说明 php提供文件的储存和下载,nginx作为web服务器,fpm做解析. 现象 当下载一个5M大小的图片时,总提示下载失败,或下载下来的文件不完整,仅显示部分图像(每次下载不一样) php下载相关 ...

  2. github下载大文件太慢/失败

    场景 github下载大文件,使用浏览器下载zip包到本地在下载到1G时失败, 使用 git clone ssh下载速度20k/s以下,已fq. 解决方法(亲测) 1.下载Github Desktop ...

  3. 转(Response.WriteFile 无法下载大文件解决方法)

    以前用Response.WriteFile(filename),但当遇到大文件时无法完整下载. 该方法最大的问题,它不是直接将数据抛到客户端,而是在服务器端(IIS)上缓存.当下载文件比较大时,服务器 ...

  4. Android 开发工具类 27_多线程下载大文件

    多线程下载大文件时序图 FileDownloader.java package com.wangjialin.internet.service.downloader; import java.io.F ...

  5. [libcurl]_[0基础]_[使用libcurl下载大文件]

    场景: 1. 在Windows编程时, 下载http页面(html,xml)能够使用winhttp库,可是并非非常下载文件,由于会失败. 由此引出了WinINet库,无奈这个库的稳定性比較低,使用样例 ...

  6. Loadrunner上传文件解决办法(大文件)

    Loadrunner上传文件解决办法(大文件) 最近再做一个跟海量存储相关的项目测试,需要通过LR模拟用户大量上传和下载文件,请求是Rest或Soap,同时还要模拟多种大小尺寸不一的文件 通常情况下, ...

  7. DBeaver下载驱动文件失败

    今天首次使用DBeaver软件链接数据库时会进行下载驱动文件,例如如下图所示: 在上图中显示了下载驱动文件失败,提示“无法解决库文件,请检查网络设置”.其实,是可以正常上网的,可能是公司内网的限制,或 ...

  8. python下载大文件

    1. wget def download_big_file_with_wget(url, target_file_name): """ 使用wget下载大文件 Note: ...

  9. python 下载大文件

    当使用requests的get下载大文件/数据时,建议使用使用stream模式. 当把get函数的stream参数设置成False时,它会立即开始下载文件并放到内存中,如果文件过大,有可能导致内存不足 ...

随机推荐

  1. 2022:checking for Python executable "python2" in the PATH

    目录 一.node报错 说明 1.网上常用方法一(本博主环境无效) 2.网上常用方法二(本博主环境无效) 3.本博主使用方法(当前有效) 1.确保NodeJS环境安装没有问题,如果不会安装,请参考 构 ...

  2. 基于Drone+Gogs流水线-全面认识轻量级云原生CI引擎Drone

    1. 介绍 Drone by Harness 是一个基于Docker容器技术的可扩展的持续集成引擎,用于自动化测试.构建.发布.每个构建都在一个临时的Docker容器中执行,使开发人员能够完全控制其构 ...

  3. ## [湖南省赛2019]Findme ###

    [湖南省赛2019]Findme 1.题目概述 2.解题过程 010打开这几张图片 先简单分析一下这几张图片 简单分析 1.png 从外观上,1.png明显高度太低,需要更改 2.png 2.png末 ...

  4. python2,3的区别

    python2和python3的区别: 1.    python 2x:源代码不规范,源码重复多 python 3x:源码 清晰,简单,优美 2.python 2x:默认编码是ASCII码 编码更改: ...

  5. python 输入加密的MD5值,并搜索文件中的原始值

    此程序可以输入一串MD5的值,并在指定的文件中搜索到原始值.程序自有用处. #输入加密的MD5值,并搜索文件中的原始值 by qianxiao996 #博客地址:https://blog.csdn.n ...

  6. Java的重载以及与重写的区别

    一.什么是方法重载 方法的重载就是在同一个类中,有着若干个名字相同的方法.在具体调用这些方法的时候,通过传递参数的不同来调用这些重载方法. 二.为什么需要方法重载 方法名的定义需要做到见名知意,功能类 ...

  7. git 多人在同一分支上迭代开发时,如何保证分支提交历史保持线性

    背景 最近我们组几个同事都投入到了一个新项目,互相之间的功能耦合比较紧密,因此,是打算从master上新拉一个分支,可以理解为我们几个人的开发分支,以develop代替. 一开始,我们是打算像svn那 ...

  8. Bigdecimal 比较问题

  9. 数据库MySql的学习(1)--基本操作

    转自 博客园-hoojo-http://www.cnblogs.com/hoojo/archive/2011/06/20/2085390.html 一.数据库简单介绍 1. 按照数据库的发展时间顺序, ...

  10. springmvc对参数接收的两个注解@RequestParam和@RequestBody

    @RequestParam 作用:将请求参数绑定到控制器的方法参数上,主要用于接收几班类型参数 语法:@RequestParam(value="参数名",required=&quo ...