readfile() 和 fopen() 的区别
Posted
技术标签:
【中文标题】readfile() 和 fopen() 的区别【英文标题】:difference between readfile() and fopen() 【发布时间】:2020-04-27 09:35:23 【问题描述】:这两个代码在读取文件时都做同样的事情,那么主要区别是什么?
1-第一个代码:
$handle = fopen($file, 'r');
$data = fread($handle, filesize($file));
2秒代码:
readfile($file);
【问题讨论】:
就像...你的代码的fileopen()
位在哪里?
php 有没有fileopen()
?不是AFAIK。
@RiggsFolly 对不起,我改了标题
Fileread()
直接将文件发送到输出缓冲区fread()
将文件读入字符串变量。所有这些以及更多内容都可以在 PHP 手册中参考
@tnx 对标题的回答和警告,它们的阅读速度是否不同?
【参考方案1】:
fread()
和 readfile()
之间存在显着差异。
首先,readfile()
做了很多 fread()
没有做的事情。 readfile()
打开文件进行读取,读取它,然后一口气将其打印到输出缓冲区。 fread()
只做其中一件事情:它从给定的文件句柄中读取字节。
此外,readfile()
有一些 fread()
没有的好处。例如,它可以利用可用的memory-mapped I/O,而不是较慢的磁盘读取。这显着提高了读取文件的性能,因为它将进程从 PHP 本身委托给了操作系统调用。
勘误表
我之前注意到
readfile()
可以在没有 PHP 的情况下运行(这在下面进行了更正)。
对于真正的大文件(想想像媒体文件或大型存档备份这样的几个演出),您可能需要考虑将文件的读取完全委托给您的网络服务器,而不是使用X-Sendfile
标头(这样您就不会' t 让您的 PHP 工作人员在可能需要数小时的上传时间上受累)。
所以你可以这样做而不是readfile()
:
<?php
/* process some things in php here */
header("X-Sendfile: /path/to/file");
exit; // don't need to keep PHP busy for this
【讨论】:
tnx 的综合解释,还有一件事他们的速度不同吗? 当然可以。读取 mmaped 文件的速度比从磁盘(尤其是机械磁盘)读取要快得多。【参考方案2】:阅读文档,readfile 读取整个内容并将其写入 STDOUT。
$data = fread($handle, filesize($file));
而 fread 将内容放入变量 $data 中。
【讨论】:
以上是关于readfile() 和 fopen() 的区别的主要内容,如果未能解决你的问题,请参考以下文章
php fopen与file_get_contents的区别
readFile() 和 readFileSync() 之间的区别
c语言中,再对文件的操作模式中,a和a+、w和w+、r和r+有啥区别?