Эффективный способ заменить последнюю строку из файла? - PullRequest
0 голосов
/ 23 марта 2011

Есть ли эффективный способ заменить последнюю строку из файла?

Мне нужно это для файлов журналов, чтобы иметь такую ​​строку:

21: 00: 00 - Информация- Количество: 3

Заменить на это:

21: 00: 35 - Информация - Количество: 4

И так далее. Так что это выглядит круто в хвосте-f

Проблема в том, что файлы журналов могут быть очень большими, и я не хочу, чтобы они загружались в память каждый раз, когда я хочу заменить последнюю строку.

В любом случае, если загрузкавесь файл был единственным способом, как бы вы поступили, имея в виду, что есть другие сценарии, добавляющие данные в один файл одновременно?Я думаю, что я должен заблокировать это или что-то.Я никогда не использовал это, потому что я просто использую file_put_contents с опцией FILE_APPEND.

1 Ответ

1 голос
/ 23 марта 2011

Если вы хотите эффективный способ, то прочитайте блок содержимого с конца, затем обрежьте последний найденный \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
...