2

私は、さまざまなセキュリティ関連のイベントをログに記録する必要があるプロジェクト (Symfony 2 を使用して PHP で記述された Web アプリケーション) に取り組んでいます。また、ログ ファイル内のイベントには連続した番号を付ける必要があります (項目を削除するのは簡単ではないと思います)。

ロギングにはMonolog (Symfony に付属)を使用しますが、Processor を使用してレコードに数値を追加できることはわかっています。

しかし、私が知らないのは、連続した数字を実際に確実に生成する方法です。「確実に」とは、ギャップや重複した数字がないことを意味します。

私が考えることができる唯一の解決策は、自動インクリメント ID を持つダミー テーブルを使用してデータベース (Doctrine 経由の MySQL) に数値を生成させることですが、これはロギングのオーバーヘッドが少しあるようです。

このための他の戦略は何ですか?

4

2 に答える 2

2

最後の ID を含む単一のファイルで自動インクリメント ID をエミュレートできます。ロックは競合状態を防ぎます。

$fp = fopen('/path/to/id.file', 'r+');
flock($fp, LOCK_EX);
$lastId = fgets($fp);
$currentId = $lastId + 1;
fseek($fp, 0);
fputs($currentId);

// place logging here...

flock($fp, LOCK_UN);
于 2013-03-22T09:13:41.170 に答える
0

ファイルに書き込みたい場合、信頼できる唯一の方法は、新しいレコードを書き込む前にこのファイルから最大数を読み取り、TOCTTOU問題を回避するためにファイル ロックを使用することだと思います。つまり、基本的にデータベーストランザクションがあなたのために行うことですが、ファイルを使用します:-)

毎回ログ ファイル全体をロックして読み取る必要はないかもしれません。別の「カウンター」ファイルに最後の数値のみを記録し、最後の数値の読み取り中、ログへの書き込み中にそれをロックするだけでも十分な場合があります。ファイルを作成し、カウンター ファイルの数値を更新します。

于 2013-03-22T09:11:31.190 に答える