flock
(PHP 4, PHP 5)
flock — 軽量のアドバイザリー ファイル ロック
説明
bool flock ( int $handle , int $operation [, int &$wouldblock ] )
PHP はアドバイザリー モードをサポートしています (つまり、アクセスするすべてのプログラムは同じロック方法を使用しないと機能しません) すべてのファイルをロックする軽量の方法。
注:
flock() は Windows で強制されます。
flock() 操作のハンドルは、開いているファイル ポインターである必要があります。 Operation は次の値のいずれかになります:
共有ロック (読み取りプログラム) を取得するには、operation を 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 に設定)。
flock() を使用すると、任意のプラットフォーム (ほとんどの Unix 派生製品や Windows も含む) で使用できる単純な読み取り/書き込みモデルの実装が可能になります。ロックがブロックされる場合 (EWOULDBLOCK エラー コードの場合)、オプションの 3 番目のパラメーターは TRUE に設定されます。ロック操作は fclose() によって解放することもできます (コードの実行が完了すると自動的に呼び出されます)。
成功した場合は TRUE を返し、失敗した場合は FALSE を返します。
例 #1 flock() 例
コードをコピーする コードは次のとおりです。
$fp = fopen(" / tmp/lock.txt", "w+");
if (flock($fp, LOCK_EX)) { // 排他ロックを実行
fwrite($fp, "ここに何かを書き込む ");
flock($fp, LOCK_UN) ); // ロックを解除します
} else {
echo "ファイルをロックできませんでした !"
fclose($fp)>
注: flock() にはファイルが必要ですしたがって、書き込みモードで開くことを目的としたファイルへのアクセスを保護するには、特別なロック ファイルを使用する必要がある場合があります (fopen() 関数に「w」または「w+」を追加します)。
警告
flock() は、NFS およびその他の一部のネットワーク ファイル システムでは使用できません。詳細については、オペレーティング システムのマニュアルを確認してください。
一部のオペレーティング システムでは、flock() がプロセス レベルで実装されます。マルチスレッド サーバー API (ISAPI など) を使用する場合、ファイルを保護するために flock() に依存することができない場合があります。これは、ファイルが同じサーバー インスタンス内の他の並列スレッドで実行されている PHP スクリプトによって処理される可能性があるためです。
flock() は、FAT やその派生などの古いファイル システムをサポートしません。したがって、この環境では常に FALSE が返されます (特に Windows 98 ユーザーの場合)。
PHP でのファイル ロック関数 flock 関数の使用方法の紹介:
構文:
bool flock (int $handle, int $operation [, int &$wouldblock])
flock()操作は、開いている 1 つのファイル ポインターである必要があります。操作は次の値のいずれかになります: 1. 共有ロック (リーダー) を取得するには、operation を LOCK_SH に設定します (PHP 4.0.1 より前のバージョンでは 1 に設定します)。
2. 排他的ロックを取得するには (ライター)操作を LOCK_EX に設定します (PHP 4.0.1 より前のバージョンでは 2 に設定します)
3. ロック (共有または排他的) を解放するには、操作を LOCK_UN に設定します (PHP 4.0.1 より前のバージョンでは 3 に設定します)
4.ロック時に flock() をブロックしたくない場合は、操作に LOCK_NB を追加します (PHP 4.0.1 より前のバージョンでは 4 に設定)
次のコードを見てください:
a.php
コードをコピー
コードは次のとおりです:
$file = "temp.txt"; $fp = fopen($file, 'w');
if(flock($fp, LOCK_EX))
fwrite($fp, "abc");
fwrite($fp, "123");
fclose($fp);
b.php
コードをコピー
コードは次のとおりです。
$file = "temp.txt"
$fp = fopen($file, 'r'); ; echo fread ($fp, 100); fclose ($fp)
a.php を実行した後、すぐに b.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) ; php の場合、b.php は a.php が完了するまで (つまり 10 秒後) 表示されることがわかります:
abc
123
読み取りデータは完了しましたが、待機時間が長すぎます。 b. php を変更する前に書き込みロックを解除します。
b.php を次のように変更します:
コードをコピーします
コードは次のとおりです:
$file = "temp.txt"
$fp = fopen($file, 'r '); if(flock($fp, LOCK_SH | LOCK_NB)){ echo fread($fp, LOCK_UN); echo "ファイルのロックに失敗しました..." ; }
fclose( $fp);
?>
a.php を実行した後、すぐに b.php を実行すると、次の出力が表示されます。上記のように長時間待つ代わりに、返却することができます。
Script House 編集者の結論:
ファイルをキャッシュするときは、関連するロックを選択することをお勧めします。そうしないと、読み取られたデータが不完全になったり、データが繰り返し書き込まれる可能性があります。
file_get_contents はデフォルトでどのロックを使用するのかわかりませんが、ロックしない場合でも得られる出力は同じであり、不完全なデータです。
http://www.bkjia.com/PHPjc/326421.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/326421.html
技術記事
flock (PHP 4、PHP 5) flock — 軽量のアドバイザリー ファイル ロック命令 bool flock ( int $handle , int $operation [, int lt;?php $fp = fopen("/tmp/lock.txt", "w+" ) ; if (flock($fp, LOCK_EX...