bool flock ( int handle, int Operation [, int &wouldblock] );
flock() 操作のハンドルは、開いているファイル ポインターである必要があります。操作は次の値のいずれかになります:
2 つのファイルを作成
(1) a.php
$file = "temp.txt"; $fp = fopen($file , 'w'); if(flock($fp , LOCK_EX)){ fwrite($fp , "abc\n"); sleep(10); fwrite($fp , "123\n"); flock($fp , LOCK_UN); } fclose($fp);
(2) b.php
$file = "temp.txt"; $fp = fopen($file , 'r'); echo fread($fp , 100); fclose($fp);
a.php を実行した後、すぐに b.php を実行すると、出力が表示されます:
abc
a.php が実行されるのを待って、b.php を実行すると、出力が表示されます:
abc
123
明らかに、 a. php がファイルを書き込むとき、データが大きすぎて時間がかかります。このとき、b.php は不完全なデータを読み取ります
b.php を次のように変更します。
$file = "temp.txt"; $fp = fopen($file , 'r'); if(flock($fp , LOCK_EX)){ echo fread($fp , 100); flock($fp , LOCK_UN); } else{ echo "Lock file failed...\n"; } fclose($fp);
a.php を実行した後、 b.php は、a.php が完了するまで (つまり、10 秒後) 表示されるまで待機することがわかります:
abc
123
読み取りデータは完了しましたが、時間が長すぎます。 、書き込みロックが解除されるまで待たなければなりません。
b.php を次のように変更します:
$file = "temp.txt"; $fp = fopen($file , 'r'); if(flock($fp , LOCK_SH | LOCK_NB)){ echo fread($fp , 100); flock($fp , LOCK_UN); } else{ echo "Lock file failed...\n"; } fclose($fp);
a.php を実行した後、すぐに b.php を実行すると、出力が表示されます:
ロック ファイルが失敗しました...
代わりにロック ファイルの失敗ステータスを返すことができることを証明します。上記と同じリクエストの場合は、しばらく待ちます。
結論:
ファイルをキャッシュするときは、関連するロックを選択することをお勧めします。そうしないと、読み取られたデータが不完全になったり、データが繰り返し書き込まれたりする可能性があります。
file_get_contents はデフォルトでどのようなロックを使用するのかわかりませんが、ロックしない場合でも得られる出力は同じであり、不完全なデータです。
ファイルのキャッシュを実行したいので、書き込みロックがあるかどうかを知る必要があるだけで、ある場合はデータベースをチェックするだけです。
テスト環境: Linux (Ubuntu 6)、PHP 5.1.2、Apache 2
リダイレクト:
ファイル ロックには、共有ロックと排他ロック、つまり読み取りロック (LOCK_SH) と書き込みロック ( LOCK_EX)
ファイル ロックは通常次のように使用されます:
$fp = fopen("filename", "a"); flock($fp, LOCK_SH) または die("lock error") $str = fread($fp, 1024); flock($fp, LOCK_UN);
よく書かれたブログ投稿もあります:
http://hxsdit.com/1110