- 締切済み
ファイル書き込みでたまにデータが全部消えてしまう。
phpでアクセス解析を作っているのですが、 解析データをログファイルに書き込みする際に たまにデータが全部消えてしまう現象に陥りました。 下記コードでログファイルに書き込み処理をしています。 どなたか原因が分かる方、ご教授お願いいたします。 // ログデータ処理 $logdata = file($counter->logfile); list($time,$host) = explode("\t",$logdata[0]);// 比較のため直前のホスト取得 if($host != $counter->host and // 連続アクセスは処理しない !$out_flag){// 除外ホストは処理しない $str = time()."\t".// 時間 $counter->host."\t".// ホスト $counter->agent."\t".// ユーザーエージェント $counter->referer."\t".// リンク元 "\t\n"; $lp = fopen($counter->logfile,"w"); $lock = flock($lp,LOCK_EX); if($lock){ fputs($lp,$str); $i = 1; foreach($logdata as $value){ fputs($lp,$value); $i++; if($i >= $counter->loglimit){break;}// ログ上限に達したら抜ける } } flock($lp,LOCK_UN); fclose($lp); }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- shimix
- ベストアンサー率54% (865/1590)
fopen($counter->logfile,"w");の時点でファイルは空になっていますから、このタイミングで(ロックする前に)他からfile()で読んだら何もない状態です。 比較のための直前ホストの取得などはfile()で読み込んだものでもいいですが、実際に「書き込み」をするときには、"rw"で開く→ロック→全行を再取得→ファイルポインタを先頭に戻す→追加データ+再取得データを書き込み→ロック解除でないとマズイのでは?
補足
ご解答ありがとうございます。 具体的なコードが分からず困っております。 もし差し支えなければ教えていただければ幸いです。 どうかよろしくお願いいたします。