//w3school での flock 関数の使い方の紹介:
PHPのflock()関数
定義と使用法
flock() 関数は、ファイルをロックまたは解放します。
成功した場合は true を返します。失敗した場合は false を返します。
文法
flock(ファイル,ロック,ブロック)
パラメータの説明
ファイルが必要です。開いているファイルをロックまたは解放するように指定します。
ロックが必要です。使用するロックのタイプを指定します。
ブロックはオプションです。 1 または true に設定すると、ロック中に他のプロセスがブロックされます。
説明
flock() で使用されるファイルは、開いているファイル ポインターである必要があります。
ロックパラメータは次のいずれかの値になります:
共有ロック (プログラムの読み取り) を取得するには、ロックを LOCK_SH に設定します (PHP 4.0.1 より前のバージョンでは 1 に設定)。
排他的ロック (プログラムの書き込み) を取得するには、ロックを LOCK_EX に設定します (PHP 4.0.1 より前のバージョンでは 2 に設定)。
ロック (共有または排他) を解放するには、ロックを LOCK_UN に設定します (PHP 4.0.1 より前のバージョンでは 3 に設定)。
flock() をロック時にブロックしたくない場合は、ロックに LOCK_NB を追加します (PHP 4.0.1 より前のバージョンでは 4 に設定)。
ヒントと注意事項
ヒント: ロック操作は fclose() を通じて解放できます。これも、コードの実行が完了すると自動的に呼び出されます。
注: flock() にはファイル ポインターが必要なため、書き込みモードで開くことを目的としたファイルへのアクセスを保護するために、特別なロック ファイルを使用する必要がある場合があります (fopen() 関数に「w」または「w+」を追加します)。
例
出典: http://hxsdit.com/1110
PHPにはファイルロック機能が付いています:
bool flock ( int $handle , int $operation [, int &$wouldblock ] )
$handle は開いているファイル ポインターです。
$操作は
可能です
「LOCK_SH」は共有ロック、「LOCK_EX」は排他ロック、「LOCK_UN」はロックを解除します。
ここでは主に「LOCK_EX」と「LOCK_NB」について説明します。
たとえば、次のような 2 つのファイルがあります。
flocka.php
?コード PHP を表示
$file = 'temp.txt'; $fp = fopen($file,'a'); for($i = 0;$i
flockb.php
?コード PHP を表示
1 2 3 4 5 6 7 8 9
$file = 'temp.txt'; $fp = fopen($file,'a'); for($i = 0;$i
最初に flocka.php を実行し、その後すぐに flockb.php を実行します。
結果:
11111111
22222222
22222222
22222222
22222222
22222222
11111111
11111111
11111111
11111111
ファイル ロックが追加されていない場合、2 つのファイルが同時に txt ファイルに書き込まれることに注意してください。
2 つの php ファイルのコードを変更してみましょう。
flocka.php
?コード PHP を表示
$file = 'temp.txt'; $fp = fopen($file,'a'); if(flock($fp,LOCK_EX)) {for($i = 0;$i
?コード PHP を表示
1 2 3 4 5 6 7 8 9 10 11 12 13
$file = 'temp.txt'; $fp = fopen($file,'a'); if(flock($fp,LOCK_EX)) {for($i = 0;$i
flocka.php の実行が終了する前に、flockb.php が待機状態になっていることがわかります。flocka.php の実行が終了した場合にのみ、flockb.php は実行を続けます。
出力結果:
11111111
11111111
11111111
11111111
11111111
22222222
22222222
22222222
22222222
22222222
また、flockを実行するとファイルのロックが自動的に解除されます。