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() 的区别的主要内容,如果未能解决你的问题,请参考以下文章

fopen中的r和rb有啥区别

php fopen与file_get_contents的区别

readFile() 和 readFileSync() 之间的区别

c语言中,再对文件的操作模式中,a和a+、w和w+、r和r+有啥区别?

node同步读取readFileSync和异步读取readFile的区别

Jenkins中 readFile 与 File.text 的区别