【问题标题】:difference between readfile() and fopen()readfile() 和 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 对标题的回答和警告,它们的阅读速度是否不同?

标签: php file-read


【解决方案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 中。

【讨论】:

    猜你喜欢
    • 2013-07-10
    • 2014-02-02
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多