为了更清楚,我将把代码示例:
$file = fopen('filename.ext', 'rb');
// Assume $pos has been declared
// method 1
fseek($file, $pos);
$parsed = fread($file, 2);
// method 2
while (!feof($file)) {
$data = fread($file, 1000000);
}
$data = bin2hex($data);
$parsed = substr($data, $pos, 2);
$fclose($file);
方法1中大约有40个fread()(可能有15个fseek())和方法2中的1个fread()。我唯一想知道的是,当你真的只是加载1000000字节时是否过度杀伤提取总共100个字节(在文件中间相对靠近)。
那么哪些代码的表现会更好?使用哪种代码更有意义?非常感谢快速解释。
答案 0 :(得分:4)
如果您已经知道要查找的偏移量,那么fseek是最好的方法,因为如果您只需要几个字节,就没有理由将整个文件加载到内存中。第一种方法更好,因为您可以直接跳到文件流中的所需内容并读出一小部分。第二种方法要求您将整个文件读入内存,然后在您可以直接从文件中读取它的同时进行搜索。希望这能回答你的问题
答案 1 :(得分:3)
文件以群集为单位读取,群集通常类似于8 kb。通常会提前阅读一些群集。
因此,如果文件只有几kb,那么与阅读整个文件相比,使用fseek几乎没有什么收获。无论如何,文件系统将读取整个文件。
如果文件相当大,就像你的情况一样,只需要读取一些簇,所以第一种方法应该更好。在最坏的情况下,仍然会从磁盘读取所有数据,但您的应用程序仍将使用更少的内存。
答案 2 :(得分:1)
似乎寻找你想要的位置,然后只读取你需要的字节是最好的方法。
但正确的答案是(一如既往)将其测试为真实而非猜测。在服务器环境中运行两个示例并进行一些时间测量。还要检查内存使用情况然后在获得一些硬数据进行备份后进行优化。