华人澳洲中文论坛

热图推荐

    如何完成大文件(几百M或几个G)下载?

    [复制链接]

    2022-10-16 18:11:05 19 0



    在文章《文件太大上传不了?看这里,秒传》中,咱们曾经引见了大文件(几百M或几个G)上传的办法,也就是使用分片上传,置信大家已有所理解。分片上传的原理是经过将大文件联系成一个个的小文件,来冲破办事器内存和时间的限度,从而完成大文件上传的目的。大文件下载,其实跟大文件上传有异曲同工之妙,它也需求冲破办事器内存和时间的限度。
    上传和下载之所以都要冲破内存和时间的限度,其实与缓冲区无关。缓冲区是存储速度不同的装备或者优先级不同的装备之间传输数据的区域。按照操作类型的不同,缓冲区可分为输出缓冲区和输入缓冲区。一切输出或输入的内容都需求先通过缓冲区,而后能力进行后续操作。使用缓冲区,能够使过程之间的互相等候变少,从而机能更好。


    在PHP中有三层缓冲区,顺序缓冲区、PHP-FPM缓冲区、Webserver缓冲区(Nginx/Apache)。当咱们使用echo、print等输入函数打印数据时,数据会从顺序缓冲区活动到PHP-FPM缓冲区、Nginx缓冲区、阅读器缓冲区,默许状况每一个层缓冲区刷新到下一层缓冲区的时间节点是该层的输入缓冲区被写满或文件被封闭。


    PHP的输入缓冲区默许是不开启的。在此状况下,一切输出的数据都要当即写入磁盘,一切输入的数据都要当即从磁盘读取。因为操作磁盘对比损耗机能,同时速度又慢,这样关于大文件,那必定会发生内存溢出或超时的问题。所以,为防止此状况产生,在下载的时分,咱们就需求开启输入缓冲区,以完成将文件内容一点点地读取,而且是读取一点就向客户端发送一点。
    PHP输入缓冲区的开关和大小设置由php.ini管制,其中output_buffering管制输入缓冲区的开启和大小设置,implict_flush管制输入缓冲区满了是不是自动刷新到下一层。固然,咱们也能够使用PHP中的ob系列函数进行手动操作。ob_start是开启PHP缓冲区,ob_flush是刷新PHP缓冲区,flush是刷新Webserver的缓冲区,ob_end_flush是清空并封闭PHP缓冲区。
    上面咱们展现一下详细的完成示例。


    这里需求留意的是,Webserver和阅读器也都有本人的输入缓冲区,个别output_buffering默许是4069字符或者更大,即输入内容必需达到4069字符Web才会刷新输入缓存到下一层。所以,为了确保使用flush函数后,内容能当即从客户端输入,输入的内容必需要等于或大于4096字符。
    经过以上操作,咱们就冲破了办事器的内存和时间限度完成了大文件的下载了。

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    返回列表 本版积分规则

    :
    中级会员
    :
    论坛短信
    :
    未填写
    :
    未填写
    :
    未填写

    主题36

    帖子43

    积分203

    图文推荐