zoukankan      html  css  js  c++  java
  • PHP中输出文件,怎么区别什么时候该用readfile() , fread(), file_get_contents(), fgets()

    我在服务器端(Apache环境)上放了一个安卓apk安装包的下载链接,使用readfile()读取apk文件输出下载后,手机安装apk显示解析包错误。但apk本身没问题,下载后文件的大小也是完整的。服务器mime也设置了。后来换用fread()后输出就好了。不明白是为什么。搜索了一下没遇到解释的很清楚的,有说是因为「对二进制友好」,有这么一说吗?

    包括还有file_get_contents()fgets()等另外的几个文件读取函数和方法,一直都不能很好的分清什么时候该用哪个。除了手册之外,有没有一些有应用场景的好的介绍文章?

    补上前后的代码:
    readfile():

    header("Content-type: application/vnd.android.package-archive"); 
    header("Accept-Ranges: bytes");
    header("Accept-Length:".$filesize ); 
    header("Content-Disposition: attachment; filename=".$name);
    readfile($file);
    

    fread():

    header("Content-type: application/vnd.android.package-archive"); 
    header("Accept-Ranges: bytes");
    header("Accept-Length:".$filesize ); 
    header("Content-Disposition: attachment; filename=".$name);
    
    $handle = fopen($file,"r"); 
    echo fread($handle,$filesize);
    fclose($handle);


    如果是直接写入或读取全部直接用 file_get_contents() file_put_contents() 更方便
    fread 可以读取指定大小,读取指定行等等,还能锁定文件功能比较强

    以下是readfile手册中的解释:
    readfile() 函数输出一个文件。
    该函数读入一个文件并写入到输出缓冲。
    若成功,则返回从文件中读入的字节数若失败,则返回 false,这个函数会在文档最后输出字节数。

      1. fread() 和 readfile()
        fread() 最大一次性能读取 8k长度的字节数,所以不能一次性读取大文件去作下载。 优势在于,操作更加灵活,每次读取指定字节的内容,用于下载时方便控制服务器的流量。
        readfile() 优势是能够一次性读取大文件;不需要PHP预读到内存,下载速度更快,直接把文件的处理交由服务器。缺点就是不能控制负载。所以它是没有内存限制的,如果遇到报内存错误,先调用 ob_end_flush()之类的函数关闭缓冲区。
      2. file_get_contents 也是没 readfile()快, 因为也是走了php的内存。但是在读取小文本内容到字符串变量时,这个函数最适合使用,简单,更快。
      3. fgets() 是一次读取文件中的一行了,再需要逐行处理文件的时候,使用这个
  • 相关阅读:
    Java基础(01)--简介及基础语法
    高数(01)--函数、极限、连续
    未来行业及趋势
    HttpRunner基础使用一:
    web自动化中js操作的操作应用
    django框架学习六:优化views.py文件,使用rest_framework中的APIVew和Response返回
    django框架学习五:djangorestframework中ModelSerializer的关联字段的生成
    django框架学习四:引入djangorestframework中ModelSerializer
    django框架学习三:djangorestframework中序列化器的优化:添加单字段、多字段、自定义函数的校验
    django框架学习三:使用DRF框架,引入序列化器,实现对数据库的增删改查操作
  • 原文地址:https://www.cnblogs.com/xiaoleiel/p/8324232.html
Copyright © 2011-2022 走看看