0

我有每天运行一次的代码,并且 fputs() 将每日日志条目附加到格式为的平面文件中:

yyyy-mm-dd|log entry

该文件然后由 fgets() 的网页显示,并显示从最旧到最新的所有记录。

我需要做的是改变这个写/读过程,以便:

A. 日志文件中仅保留 x 个最近的记录。

B. 输出顺序颠倒,最先显示最近的日志条目。

如果日志文件的顺序可以与写操作相反,那么读操作可以保持不变。

如果有比 fputs 和 fgets 更好的方法来做到这一点,我愿意接受。

谢谢

4

1 回答 1

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

使用这种方法,文件会按照您想要的顺序保存(最新的在前)。但是,如果该文件可能一次被多个进程写入,则需要实施某种形式的锁定以避免丢失数据。

于 2011-12-15T14:39:56.110 回答