【お題】引っかけ問題(締め切り10月27日(日)23時)

アクセスカウンターを過去に2回ほど作りましたが、どちらもアクセス数が増えてくるとある日突然データが消えてまた0からカウントしてしまいます。
特にサーバーの空き領域がなくなったわけではないのですし、書き込み時にはファイルロックをかけているのですが、どなたか同じような体験をされたかたはいらっしゃらないでしょうか。
普通、書き込みが多いファイルに関してはファイルロック以外何かバックアップ手段を用意しておくものなのでしょうか。
よろしくお願いします。

A 回答 (3件)

>書き込み時にはファイルロックをかけているのですが


読み込み時にはロックしていないのでしょうか?
unix系のサーバーでflockを使っているのであれば、
読み込み時もロックしないと、ロックされているファイルであろうが無かろうが読みに行ってしまって、
既に書き込み中だと、0バイトしか読みとれず、0バイトを書き込むのでデータが飛ぶということになります。
ロックしていれば、書き込み完了&ロック解除を待ってから読み込み始めます。
つまり、読み書き両方でロックしないと、ロックを掛ける意味が無くなるのです。

それ以外にも、原因があるかもしれませんが思いつくところは上記ですね。
    • good
    • 0
この回答へのお礼

読み込み時にはロックをかけていませんでした。
処理が簡単なのでfileで読み込みし、書き込み時のみロックをかけていました。
それが原因のようですね。
ありがとうございました。

お礼日時:2005/09/28 09:25

既に回答が出ていますが、補足として。



flock()や、mkdir(), symlink()などのロック手段の代わりに(若しくは追加として)、rename()を使うというのがあります。
つまり、データを一時作業ファイルに書き込み、書き込み作業が終わったら(ファイルをクローズしたら)、データファイルを残したままの状態(これが重要)で、

rename( 一時作業ファイル名, データファイル名 );

とするものです。
これの特徴(?)は以下の通りです。

・書き込み作業中でもデータファイルの読み出しが可能。
これはアクセスカウンターでは意味がありませんが、例えば掲示板のログファイルなどでは書きこみ作業中でも閲覧が可能となります。
逆に言うと、更新作業中に新しい更新作業が入ると、古いデータに対して更新をしてしまうことになります。(アクセスカウンタの場合、1つ番号が進まなくなる。掲示板では直前の書き込みが失われる。)
これの対処は、hrm_mmmさんが言われているように、更新のための読み出し前に排他ロックをかけます。

・データファイルをそのままに、別途、作業ファイルに(通常)ほぼ同等のデータを書き込むので、必要なファイル領域が2倍になります。

カウンタであれば、ファイル容量は気にすることも無いですし、多少進まなくなるくらい許されそうなので、今回はrename()だけ簡単に済ませるのもありかと思います。

あと、

> 普通、書き込みが多いファイルに関してはファイルロック以外何かバックアップ手段を用意しておくものなのでしょうか。

とのことですが、わたしがお手伝いしたところ(Perlでしたが…)では、最終的に、ファイルロック(symlink()で実現)&rename()&バックアップファイル保持、と、かなり重厚になりました。環境次第ではないでしょうか。
# とあるプロバイダは、サーバの負荷が高いと
# スクリプトがCPU制限時間前に落とされるのと、
# flock()使えばrename()は要らない気がするの
# ですが、NFS越しだとflock()は使えなけど、
# その辺りの情報は非開示だったので、結局…。

※rename()はUnix環境でしか試したことがないので、Windows環境ではうまくいかないかもしれません。
    • good
    • 0
この回答へのお礼

そうですね、renameは人のソースを見ているとたまに見かけるのでそれが一般的なのかと思い今回質問させて頂きました。
しかしやはり処理が煩雑になるのでそのプログラムの使われ方などを見てどのような処理をするか検討していきたいと思います。
ご丁寧にありがとうございました。

お礼日時:2005/09/28 09:28

排他処理が完全じゃないのだと思います。


もし頻繁に同現象が確認できるのであれば、
アクセスカウンターの処理にログをとる機能を
つけて検証してみるとよいでしょうね。

OSやCGIの仕組みによっては思ったほど堅牢に
ファイルロックがされないこともあるようです。
    • good
    • 0
この回答へのお礼

なるほど、ログをとるのも方法ですね。
ありがとうございました。

お礼日時:2005/09/28 09:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報