从文件中替换最后一行的有效方法?

时间:2011-03-23 16:01:34

标签: php file logging

是否有一种有效的方法可以替换文件中的最后一行?

我需要这个日志文件,才能拥有这种行:

21:00:00 - 信息 - 数量:3

替换为:

21:00:35 - 信息 - 数量:4

等等..所以它在尾巴-f

看起来很酷

问题是日志文件可能变得非常大,我不希望每次我想要替换最后一行时将它们加载到内存中。

无论如何,如果加载整个文件是唯一的方法,你会怎么做呢,记住还有其他脚本同时将数据附加到同一个文件?我想我必须把它锁起来。我从未使用过它,因为我只使用带有FILE_APPEND选项的file_put_contents。

1 个答案:

答案 0 :(得分:1)

如果您想要高效方式,请从最后读取一个内容块,然后截断最后找到的\n。这不是很好,但有效:

$fn = "LICENSE";
$size = filesize($fn);
$block = 4096;
$trunc = max($size - $block, 0);

$f = fopen($fn, "c+");
if (flock($f, LOCK_EX)) {
   fseek($f, $trunc);
   $bin = rtrim(fread($f, $block), "\n");
   if ($r = strrpos($bin, "\n")) {
      ftruncate($f, $trunc + $r + 1);
   }
}
fclose($f);   // clears LOCK_EX