ホームページ > バックエンド開発 > PHPチュートリアル > PHPでのflockファイルロックの詳しい説明

PHPでのflockファイルロックの詳しい説明

WBOY
リリース: 2016-07-25 09:03:12
オリジナル
1253 人が閲覧しました
  1. $fp = fopen("/tmp/lock.txt", "w+");
  2. if (flock($fp, LOCK_EX)) { // 排他ロックを実行
  3. fwrite ($ fp, "ここに何かを書いてください ");
  4. flock($fp, LOCK_UN); // ロックを解除します
  5. } else {
  6. echo "ファイルをロックできませんでした !";
  7. }
  8. fclose($fp);
  9. ? >
コードをコピー

備考: 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. 共有ロック (リーダー) を取得するには、操作を 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

  1. $file = "temp.txt";
  2. $fp = fopen($file, 'w');
  3. if(flock($fp, LOCK_EX)){
  4. fwrite($ fp, "abc");
  5. fwrite ($fp, LOCK_UN);
  6. ;コード
  7. ファイルをコピーします: b.php
$file = "temp.txt";

$fp = fopen($fp, 'r');

fclose($fp); ;
?>
  1. コードをコピーします
  2. a.php を実行した後、すぐに b.php を実行すると、出力が表示されます。 ABC a.php の実行が終了したら、b.php を実行すると、出力が表示されます。 ABC 123 明らかに、a.php がファイルを書き込むとき、データが大きすぎて時間がかかります。このとき、b.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 "ファイルのロックに失敗しました...";
    }
  1. fclose($fp);
  2. ?>
  3. コードをコピー
  4. a.php を実行した後、すぐに b.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, 100);

flock($fp, LOCK_UN);

} else{
echo "ファイルのロックに失敗しました...";
}
    fclose($fp);
  1. ?>
  2. コピーcode
  3. a.php を実行した後、すぐに b.php を実行すると、出力が表示されます。 ファイルのロックに失敗しました… 上記のように長時間待たずに、ロックファイル失敗ステータスを返せることが証明されました。 スクリプトハウス編集者の結論: ファイルをキャッシュするときは、関連するロックを選択することをお勧めします。そうしないと、読み取られたデータが不完全になったり、データが繰り返し書き込まれたりする可能性があります。 File_get_contents はデフォルトでどのようなロックを使用するのかわかりません。とにかく、ロックしないと得られる出力は不完全なデータと同じです。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート