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,这个函数会在文档最后输出字节数。
fread()
和readfile()
fread()
最大一次性能读取 8k长度的字节数,所以不能一次性读取大文件去作下载。 优势在于,操作更加灵活,每次读取指定字节的内容,用于下载时方便控制服务器的流量。readfile()
优势是能够一次性读取大文件;不需要PHP预读到内存,下载速度更快,直接把文件的处理交由服务器。缺点就是不能控制负载。所以它是没有内存限制的,如果遇到报内存错误,先调用ob_end_flush()
之类的函数关闭缓冲区。file_get_contents
也是没readfile()
快, 因为也是走了php的内存。但是在读取小文本内容到字符串变量时,这个函数最适合使用,简单,更快。fgets()
是一次读取文件中的一行了,再需要逐行处理文件的时候,使用这个
PHP中输出文件,怎么区别什么时候该用readfile() , fread(), file_get_contents(), fgets()的更多相关文章
- nodeJS中读写文件方法的区别
导言:nodejs中所有与文件相关的操作都在fs模块中,而读写操作又是我们会经常用到的操作,nodejs的fs模块针对读操作为我们提供了readFile,read, createReadStream三 ...
- 浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别
本文以CaffeNet为例: 1. train_val.prototxt 首先,train_val.prototxt文件是网络配置文件.该文件是在训练的时候用的. 2.deploy.prototxt ...
- Mybatis中输出映射resultType与resultMap的区别
Mybatis中输出映射resultType与resultMap的区别 (原文地址:http://blog.csdn.net/acmman/article/details/46509375) 一.re ...
- java遍历给定目录,树形结构输出所有文件,包括子目录中的文件
(转自:http://blog.csdn.net/gangwazi0525/article/details/7569701) import java.io.File; public class Rea ...
- 【记录】尝试用android-logging-log4j去实现log输出内容到sd卡中的文件的功能
[背景] 折腾: [记录]给Android中添加log日志输出到文件 期间,已经试了: [记录]尝试用android中microlog4android实现log输出到文件的功能 但是不好用. 然后就是 ...
- python 处理文件夹中的文件(新建另一个文件保存),listdir顺序输出
1.原始文件
- C语言中 *.c和*.h文件的区别!
C语言中 *.c和*.h文件的区别! http://blog.163.com/jiaoruijun07@126/blog/static/68943278201042064246409/ ...
- c++中智能输出文件
首先我们要为每一时间步,设置一个文件名: ] = "; itoa(time,timestr,); std::string s; s += timestr; std::string path ...
- 读书笔记-详解C程序开发中 .c和.h文件的区别
一个简单的问题:.c和.h文件的区别 学了几个月的C语言,反而觉得越来越不懂了.同样是子程序,可以定义在.c文件中,也可以定义在.h文件中,那这两个文件到底在用法上有什么区别呢? 2楼: 子程序不要定 ...
随机推荐
- BZOJ 2146 Construct
Construct [问题描述] 随着改革开放的深入推进…… 小T家要拆迁了…… 当对未来生活充满美好憧憬的小T看到拆迁协议书的时候,小T从一位大好的社会主义青年变成了绝望的钉子户. 由于小T的家位于 ...
- 【转载】SQL SERVER 函数大全
SQL Server 函数大全 一旦成功地从表中检索出数据,就需要进一步操纵这些数据,以获得有用或有意义的结果.这些要求包括:执行计算与数学运算.转换数据.解析数值.组合值和聚合一个范围内的值等. 下 ...
- Android代码中设置字体大小,字体颜色,显示两种颜色.倒计时效果
Android代码中设置字体大小,字体颜色,显示两种颜色 在xml文件中字体大小用的像素 <TextView android:id="@+id/uppaid_time" an ...
- AC日记——黑魔法师之门 codevs 1995
1995 黑魔法师之门 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 经过了16个工作日的紧张 ...
- HDU 5727.Necklace-二分图匹配匈牙利
好久没写过博客了,把以前的博客补一下. Necklace Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- 利用Jdk 6260652 Bug解析Arrays.asList
在java.util.ArrayList源码中: c.toArray might (incorrectly) not return Object[] (see 6260652) 产生疑惑: 附上Jav ...
- 如何让自己的程序支持iPhone5–RetinaImages
我们知道如果想让程序的启动图像能够适应iPhone5(640X1136),那么我们需要把启动的图像命名以“-568h@2x”结尾的图片,那 么是不是程序中用到的所有图片都可以用这样的方式来命名,以适合 ...
- arcgis10安装及破解
操作系统:win7 arcgis版本:10.0 1.运行arcgis10安装包里的esri.exe,出现以下安装界面.先点“许可管理器”的“安装”,一路点下去,什么都不用管. 2.完成后在lic ...
- bit、位、byte、字节、B、KB、字符与网速
一.存储单位bit和Byte 1.bit(比特) bit就是位,也叫比特位,是数据存储的最小单位.简写为小写字母“b” 二进制的一位,每个0或1是一个bit 2.Byte(字节) Byte是字节,也有 ...
- tts和字符集的关系--要求源和目的端的数据库字符集必须一样,国家字符集必须一样。
tts和字符集的关系--要求源和目的端的数据库字符集必须一样,国家字符集必须一样. imp sys/as TRANSPORT_TABLESPACE=Y datafiles= C:\oracle\pro ...