前回、Ruby で作成したアクセスカウンターがリセットしてしまった件について書きました。その後、ソースを読んで原因について考えました。カウンタは count1.dat などのテキストファイルに格納されていて、読み込む際にエラーが起きるとファイルの内容は無視して変数 count に必ず1を設定しています。そのためオープン/読み込み/クローズのいずれかでエラーが起きリセットしてしまっている可能性が非常に高いと思います。
おそらく複数のサイトから同時にアクセスがあった場合にこのようなことが起きると推測できます。時間を置いて再度チャレンジすればうまくいく可能性が上がるでしょう。
対策としては、上記のようにリトライしてみるということと、同様の問題が起きたときのためにエラーログを残すことの両方を実現する予定です。
リトライでは乱数を使用して100ms単位でスリープしたのち再度読み込むようにしたいと思います。
エラーログについては、rescue => e とすると e にエラーの内容を獲得できるので、これと日時の情報をログファイルに書き込むようにしたいと思います。
それから、カウンタ用ファイルへの書き込みの際はファイルのロックもエラー処理も行っていませんでしたが、こちらも読み込みの際と同様の処理を追加したいと思います。
(つづく)
