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. python学习之matplotlib实战

    import numpy as np def main(): # print("hello") # line import matplotlib.pyplot as plt x = ...

  2. Superset安装部署操作

    目录 1.安装Miniconda 1.下载Miniconda 2.安装 3.开启一个新的shell窗口 4.设置新窗口不自动开启conda 2.创建Python3.7环境 1.配置国内镜像 2.常用命 ...

  3. pthread_once函数

    http://blog.csdn.net/lmh12506/article/details/8452659 pthread_once()函数详解 在多线程环境中,有些事仅需要执行一次.通常当初始化应用 ...

  4. vue解除双向绑定?

    let obj = JSON.parse(JSON.stringify(this.temp1));

  5. SpringBoot的 Actuator 是做什么的?

    本质上,Actuator 通过启用 production-ready 功能使得 SpringBoot 应用程序变得更有生命力.这些功能允许我们对生产环境中的应用程序进行监视和管理. 集成 Spring ...

  6. Mybatis框架基础入门(二)--架构简介

    mybatis配置 SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息. mapper.xml文件即sql映射文件,文件中配置了操作数据库的 ...

  7. 什么是 ThreadLocal 变量?

    ThreadLocal 是 Java 里一种特殊的变量.每个线程都有一个 ThreadLocal 就是每 个线程都拥有了自己独立的一个变量,竞争条件被彻底消除了.它是为创建代价 高昂的对象获取线程安全 ...

  8. 两个对象值相同(x.equals(y) == true),但却可以有不同的hashcode?

    这个得看情况,如果该对象重写了equals方法,那么可能会出现equals相同,但hashcode不同的情况,但假如没有重写equals方法,那么它默认继承是Object的equals方法,根据源码可 ...

  9. scrapy框架初识及使用

    一.什么是Scrapy? Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍.所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等) ...

  10. 调用高德地图web api 规划路线

    实现地图输出,出发地与目的地路线,效果如下 具体代码如下 <!doctype html> <html> <head> <meta charset=" ...