PHPではflockによるファイルのロックが出来ます。
ファイルロックとは、アクセスカウンタなどで複数人数が同時にアクセスしても、ファイルが飛んでしまわないようにする仕組みです。
flock はOSの仕組みを利用した高速かつ強力なファイルロックの仕組みです。
が、この仕組みを詳しく知らないで使っていると、ファイルが飛んでしまった、
ということが起こってしまいます。
flockはファイルポインタを引数にとり、ファイルロックを設定、解除するための関数です。
flock($fp,LOCK_EX) のように、
排他ロックをかけた場合は、他のプロセスはファイルの変更、参照が出来なくなります。
他プロセスが、参照/変更しようとしても、他プロセスはflock($fp,LOCK_UN)されるまで待ちの状態になります。
flock($fp,LOCK_SH) のように、
共有ロックをかけた場合は、参照は出来るが、変更が出来なくなります。
他のプロセスが変更しようとしても、他プロセスはflock($fp,LOCK_UN)されるまで待ちの状態になります。つまり、自分が読んでいる最中は変更されないことが保証されます。
こういう仕組みが存在しますが、
<?php
$fp = fopen("ファイル名","w");
flock($fp,LOCK_EX);
fputs($fp,"aaa");
flock($fp,LOCK_UN);
fclose($fp);
?>
のようなコードをよく見ますが、これではflockの意味がありません。
fopenで、w モードで開くと、その時点でファイルは 0 バイトになります。
そのため、複数プロセスでアクセスしたとすると、ファイルは飛んでしまうことが多くなります。
w モードでのファイルロックは、fopen の前に、ロックを示すためのディレクトリを作成しておいて、書き込んだ後にディレクトリを削除する、というような独自の仕組みを作る必要があります。
PHPのflock関数は、
r+ モード(読み書きモード)や、
a モード(追加書き)でファイルを開いた場合には有効なロック方法です。
r+,
a モードでファイルを開いた場合は、w モードの場合と違い、ファイルは0バイトにはなりません。
その代わり、ファイルを1から書き直したい場合は、すでにあるファイルの内容をどうするか考えなければいけなかったりしますのでおすすめ出来ません。
それぞれ使いようだと思いますが、ファイルのサイズが増えることはあっても、減ることはないような場合(たとえばアクセスカウンタなど)、
r+モードで開いてflockしたほうが安全で確実な方法です。
スポンサードリンク
もどる