2011-12-15 9 views
0

私は一日一回実行されるコードとfputs()の形式でフラットファイルへの毎日のログエントリ追加があります。このファイルは、その後で表示されはどのように最初の最新のレコードをファイルに書き込む

yyyy-mm-dd|log entry 

をfgets()を呼び出し、古いものから最新のものまでのすべてのレコードを表示するWebページ。最新のレコードがログファイルに保存されているだけのx

A.:私がする必要がどのような

がいるので、この書き込み/読み出し処理の変更です。

B.最新のログエントリを最初に表示して、出力順序を逆にします。

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

fputsとfgets以外の方法がある場合は、私はそれを公開しています。 (それが最もメモリ効率的な方法ではありませんが)これです

おかげ

+0

[PHPのファイルの先頭に書く必要があります]の複製が可能です(http://stackoverflow.com/questions/1760525/need-to-write-at-beginning-of-file-with-php) –

+0

@ BradChristieその質問ではファイルのソートやレコード数の制限は必要ありません。 – user191688

+0

あなたはログの始めに書き込む方法を尋ねました。そうです。それだけでなく、ファイルをX個の行に限定しています。これは、すでにファイルを開いているときには簡単です。 –

答えて

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

このアプローチを使用して、ファイルが順番に保たれていますそれはあなたが望むことです(最新のものから)。ただし、一度に複数のプロセスがこのファイルを書き込む場合は、データを失わないようにロックを実装する必要があります。

+0

良い答え。 1日に1回実行されるので、複数のプロセスについて心配する必要はないと思います。 – FakeRainBrigand

+0

@DaveRandomこれは答えのようです。後でプラグインし、必要に応じてアップデートを投稿します。ありがとう。 – user191688

関連する問題