$fpが権限を握るflockによるファイルロック
果たして、この記事が役に立つか疑問ですが、私の様にポカをする人がいないとも限りませんし、忘備録的に書いてみます。
先日カウンターのログが頻繁に壊れると指摘があり、原因が分からず2日程考えていた時、ふと疑問が。テストしてみると、全くロックできていない。実はこう書いていました。
PHP:
自分では正しいと思っていたんですけど、実はlock()はtrueしか返さず、後にロックが外れます。どうなっているかと言うと、lcok()と同時にロックされ真が返りますが、$fpがローカル変数で既に用済みな為、ロックが外れてしまうのです。flockによるファイルロックは$fpが生きている必要があります。つまり、以下でもロックが外れます。
よって、こう書いて解決。
関数にしなきゃいいだけの話。
PHP:
上の例と違い、ログファイルを追記モードで扱う場合はロックファイルを用意する必要はありません。また、追記モードで書込モードの様に空にしてから書き込む事もできます。
PHP:
この場合、fclose($fp);する前にflock($fp, LOCK_UN);でロックを解除すると閉じる前に他の書き込みが割り込む可能性があり、好ましくありません。ロックはfclose()で解除されますし、fclose()は記述がなければスクリプト終了時にコールされます。