Как сначала записать в файл самую последнюю запись

У меня есть код, который запускается один раз в день, а fputs() добавляет запись ежедневного журнала в плоский файл в формате:

yyyy-mm-dd|log entry

Затем этот файл отображается веб-страницей, которая вызывает fgets() и отображает все записи от самых старых до самых новых.

Что мне нужно сделать, так это изменить этот процесс записи/чтения так, чтобы:

О. В файле журнала хранятся только x самых последних записей.

B. Порядок вывода меняется на противоположный, самая последняя запись журнала отображается первой.

Если порядок файла журнала может быть изменен на обратный с операцией записи, то операция чтения может остаться неизменной.

Если есть лучший способ сделать это, кроме fputs и fgets, я открыт для него.

Спасибо


person user191688    schedule 15.12.2011    source источник


Ответы (1)


Я думаю, что лучший способ сделать это (хотя это не самый эффективный способ памяти) таков:

function writeLogEntry ($filePath, $str, $maxRecords) {
  $fileData = file($filePath); // Get file contents as array
  array_unshift($fileData, $str); // Add the log entry to the beginning
  if (count($fileData) > $maxRecords) { // Strip old records off
    $file = array_slice($fileData, 0, $maxRecords);
  }
  file_put_contents($filePath, $fileData); // Write file again
}

$logEntry = "yyyy-mm-dd|Something happened\n";

writeLogEntry('/path/to/file', $logEntry, 1000);

При таком подходе файл хранится в нужном вам порядке (самые новые — первыми). Однако, если этот файл может быть записан более чем одним процессом одновременно, вам потребуется реализовать некоторую форму блокировки, чтобы избежать потери данных.

person DaveRandom    schedule 15.12.2011
comment
хороший ответ. Я не думаю, что вам нужно беспокоиться о нескольких процессах, потому что они запускаются один раз в день. - person Brigand; 15.12.2011
comment
@DaveRandom Это похоже на ответ. Я подключу его позже и опубликую обновление, если это необходимо. Спасибо. - person user191688; 15.12.2011