- 締切済み
ファイルの読み書きでエラー
下記のようなプログラムでファイルからデータを読み、 データを加工して、ファイルに書き込んでいます。 しかし、頻繁にアクセスがあると、読み出しのエラーや ファイルの中身が消えてしまう症状も発生します。 (ファイルの中身が消えるのは読み出し時にデータが 読めないからかも知れません) エラーをなくす為にはどうしたら良いのでしょうか? 教えて下さい。 $cmdata = file($cmfile); //ファイルからデータを読む ・ ・(データの加工) ・ $fp = @fopen($cmfile,"w+"); flock($fp,LOCK_EX); for( $i=0; $i<count($cmdata); $i++ ) { fputs($fp, $cmdata[$i]); } //ファイルにデータを書く flock($fp,LOCK_UN); fclose($fp);
補足
ありがとうございます。色々と試していたので返事が遅くなりました。 >そもそも読み込んだものを追記している?のは >どんなデータを処理をしているんだろ・・ 何十ページもあるサイトのカウンターを1つのファイルで記録しているようなものをイメージして下さい。 だから、「このページにアクセスがあった時は、この数を増やす」という処理が必要となり、どのデータを書き替えるかランダムで「追記」では対応できません。多少、カウントの誤差があっても構わないですが「データが消える」という事態は避けたいです。 前回の「2回読んで同じデータなら」というやり方では読み込みエラーが多く、エラーの回数を減らしたかったので、待ち時間も設定して、何度かデータを読み事にして、次のようなプログラムで試しています。 ************************ ここから ************************ $ok_flag = 0; for( $i=0; $i<50; $i++ ) {usleep(20000); // 2/100sec. $cmdata1 = file($cmfile); $cmdata2 = file($cmfile); if( ($cmdata1 == $cmdata2 ) == true && $cmdata1 !== false ) { $ok_flag = 1; break; } } if ( $ok_flag == 1 ) { // 正しい時の処理 { else { // データ読み込みを失敗した時の処理 { ************************ ここまで ************************ >@fopen($cmfile,"rw"); >として、読み書き可能で開いて直後にflockの方がいいですね。 かなり多くのアクセスがある事が考えられるので、flock の時間は短くしたい所で、「読んで」「処理して」「書き込み」の間、flock をすると、その間、他のアクセスがあった時の処理ができないので避けたいと考えています。 (1)あるアクセスによりデータを読んだ後 (2)他のアクセスで書き替えられ (3)その後、(1)で読んだデータを処理して、データを書き込む という事が起これば、(2)で書き替えられたデータは無効になりますが、それは別に構わないと考えています。 「アクセスが集中してもデータが消えない」という事を優先させ、その次に「多少、待ち時間があってもエラーの処理は避けたい」と考えています。