为了账号安全,请及时绑定邮箱和手机立即绑定

PHP中输出文件,怎么区别什么时候该用readfile() , fread(), file_get_contents(), fgets()?

PHP中输出文件,怎么区别什么时候该用readfile() , fread(), file_get_contents(), fgets()?

慕工程0101907 2019-04-13 08:45:50
我在服务器端(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");echofread($handle,$filesize);fclose($handle);
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

如果是直接写入或读取全部直接用file_get_contents()file_put_contents()更方便
fread可以读取指定大小,读取指定行等等,还能锁定文件功能比较强
以下是readfile手册中的解释:
readfile()函数输出一个文件。
该函数读入一个文件并写入到输出缓冲。若成功,则返回从文件中读入的字节数若失败,则返回false,这个函数会在文档最后输出字节数。
                            
查看完整回答
反对 回复 2019-04-13
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

fread()和readfile()fread()最大一次性能读取8k长度的字节数,所以不能一次性读取大文件去作下载。优势在于,操作更加灵活,每次读取指定字节的内容,用于下载时方便控制服务器的流量。readfile()优势是能够一次性读取大文件;不需要PHP预读到内存,下载速度更快,直接把文件的处理交由服务器。缺点就是不能控制负载。所以它是没有内存限制的,如果遇到报内存错误,先调用ob_end_flush()之类的函数关闭缓冲区。
file_get_contents也是没readfile()快,因为也是走了php的内存。但是在读取小文本内容到字符串变量时,这个函数最适合使用,简单,更快。
fgets()是一次读取文件中的一行了,再需要逐行处理文件的时候,使用这个
                            
查看完整回答
反对 回复 2019-04-13
  • 2 回答
  • 0 关注
  • 1174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号