Как записать в файл с самой последней записью в первую очередь - PullRequest
0 голосов
/ 15 декабря 2011

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

yyyy-mm-dd|log entry

Этот файл затем отображается на веб-странице fgets () и отображает все записи от самой старой до самой новой.

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

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

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

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

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

Спасибо

1 Ответ

1 голос
/ 15 декабря 2011

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

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);

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

...