アクセスカウンタ
古い話題というか、もう議論は出尽くしているかもしれんが、
まあいまさら感は否めない。
何も考えてない
- 毎回readして+1してwrite
排他する
排他しなくていい方法を考える
- 毎回ファイルに1バイトずつappend。stat()でファイルサイズを読む
- 実は100万アクセスしても1MBだ。大抵の零細サイトならこれでおk?
- truncate()でファイルサイズを変更することもできる。これならシステムコール1回で書き込み終わる
- 毎回utime()でファイルの時刻を1秒ずつ進め、stat()で最終更新時刻を取る
- システムコール1回で処理が完結するからatomicになるというやり方。カウント抜けは発生するが壊れない。
- 最初にepochのファイルを準備するのがちと面倒。ファイルコピーすると情報が飛ぶとか扱いが大変
- ファイル名にカウンタを含め、毎回rename()でファイル名変更。readdir()でファイル名を読んでカウンタ取得
- rename()もシステムコール1回で終わる
- オープンしたファイルをmmap()で開く
競合を回避する
- メッセージキューを使ってカウントアップ処理を一箇所に集中
- named pipe/POSIX queueなど。カウントアップ専任のプロセスが必要なのでちと面倒
追記
コメント欄の内容を足してみた。ありがとう!