PHP中使用'a'选项的fopen()函数的效率

3
如果我写了fopen($myfile, 'a'),并且$myfile是一个非常大的文件,那么服务器是否必须读取整个文件才能返回指向文件末尾的指针?还是它可以快速地找到指向文件末尾的指针然后返回它?
另外,当我使用fwrite()时,我假设它不会覆盖整个文件,对吗?它只是追加内容?
我基本上想弄清楚fopen()'a'选项以及fwrite()是否为O(1)或O(n),其中n是现有文件的长度。

操作系统将文件指针定位在写入的末尾,无需读取现有内容。 - mario
3个回答

4

实际复杂度取决于底层文件系统的复杂性,但 PHP 本身不会循环或读取整个文件,它会定位到末尾并从那里开始写入。在以追加模式打开文件时,fwrite 不会将其擦除(您可以轻松尝试此操作以了解其工作原理)。


谢谢Matti。当我询问fwrite()时,我真正想问的是它是否重写整个文件,而不仅仅是写入存储器对应于文件末尾的位置。我再次试图了解fwrite()的效率如何。但现在我认为很清楚它并不会重写所有内容。再次感谢您的帮助和非常快速的回复! - Tim

3

(相关)
请注意,如果您非常关心速度,您也可以使用file_put_contents而不是fopen/fwrite/fclose来追加文件:

file_put_contents($filename, $data, FILE_APPEND);

这种方法更加原子化,不需要锁定。


1
不需要读取整个文件就可以跳转到结尾,只需要简单的 seek 操作即可。

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