2011-03-23 27 views
0

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

我需要这个日志文件,有这种线:

21:00:00 - 信息 - 计数:

21:00:3

这个被替换为: 35 - 信息 - 计数:4

等等。所以它在尾-f

问题看起来很酷的是,日志文件可以得到非常大的,我不希望他们被加载到米每当我想要替换最后一行时,埃默里都是这样。

无论如何,如果加载整个文件是唯一的方法,你会怎么做,考虑到有其他脚本将数据同时附加到同一个文件?我想我必须锁定它或其他东西。我从来没有使用过,因为我只是通过FILE_APPEND选项使用file_put_contents。

+0

试图结束,回到以前的CR/LF。但为什么麻烦只是追加更晚的计数.... – 2011-03-23 16:04:08

+0

可能重复的[删除所有行,除了前20使用PHP。](http://stackoverflow.com/questions/4410077/remove-all-lines-except-first- 20-using-php/4410342#4410342) – Gordon 2011-03-23 16:06:28

+0

同意@Mitch。具体来说,我会提出一个有意修改日志文件内容的问题。日志文件,恕我直言,应该被视为附加应用程序。 – 2011-03-23 16:06:41

回答

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 
+0

这是完美的。唯一的问题是锁看起来没有被fclose()清除。我在windows上,netbeans不会让我读取文件。我只是添加了群($ f,LOCK_UN),它工作。非常感谢=) – HappyDeveloper 2011-03-23 17:35:07

相关问题