0

1 日に 1 回実行されるコードがあり、fputs() は次の形式で毎日のログ エントリをフラット ファイルに追加します。

yyyy-mm-dd|log entry

このファイルは、fgets() を実行する Web ページによって表示され、古いものから新しいものまですべてのレコードが表示されます。

私がする必要があるのは、この書き込み/読み取りプロセスを次のように変更することです。

A. ログ ファイルには、最新の x 件のレコードのみが保持されます。

B. 出力順序が逆になり、最新のログ エントリが最初に表示されます。

書き込み操作でログ ファイルの順序を逆にできる場合は、読み取り操作を変更せずにそのままにすることができます。

fputs と fgets 以外にこれを行うためのより良い方法があれば、私はそれを受け入れます。

ありがとう

4

1 に答える 1

1

The best way to do this, I think (although it is not the most memory efficient way) is this:

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 に答える