2011-03-23 37 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

相關問題