file_get_contents和fread有什么区别?

15

什么是两者之间的区别?

$contents = file_get_contents("folder/somefile.txt")

并且

$handle = fopen("folder/somefile.txt", "r");
$contents = fread($handle, filesize($filename));
fclose($handle);

就性能、文件指针处理和内存管理而言,哪种方法更好?

如果操作系统允许,file_get_contents是否使用 mmap

3个回答

6

fread有读取字符数的限制,适用于解析数据。

file_get_contents没有输入限制(据我所知)。这通常用于访问外部API等情况。


我之前遇到了fread的问题,它在从文件读取序列化数据时截断了一些字符。 - Smile
file_get_contents还有一个可选的参数用于偏移和长度。 如果未提供,则读取整个文件。在Benjamin Crouzier的示例中,两个示例都读取了整个文件。 除了使用file_get_contents而不是fopen、fread和fclose来读取文件更少的工作之外,我很好奇是否存在巨大的性能差异。另外值得注意的是,file_get_contents可以像URL一样使用包装器。 @Benjamin Crouzier 您从哪里获取的信息,表明如果可用,file_get_contents将使用mmap? - Alexander Behling
参考 https://petermoulding.com/php_file_performance_options,file_get_contents 应该比 fopen、fread 和 fclose 更慢。 我自己进行了一次基准测试,读取了同一个文件1000次。 在1000次中,有183次 file_get_contents 更快,而817次 f_reads 更快,但只相差几毫秒。 因此,我认为这两个函数的性能相等,哪个更快取决于环境状态(负载、文件系统、硬件等)。 如果您不是在实时应用程序上工作,我建议使用 file_get_contents 而不是 fread。 - Alexander Behling

5

fread()函数用于读取二进制数据,而file_get_contents()函数则将数据作为字符串返回。


我正在比较两个代码片段,并希望您考虑性能、文件指针处理和内存管理。 - Benjamin Crouzier
6
fread() 读取文件时,应该使用 b 标志打开文件以确保它是二进制安全的,而使用 file_get_contents() 则始终是二进制安全的。 - piotrp
我喜欢你的评论@Crack。顺便说一句,Organized的回答很好。 - Smile
file_get_contents:此函数是二进制安全的。 - javad shariaty

2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接