PHPファイルロックの使い方は? PHPファイルロック入門チュートリアル

WBOY
リリース: 2016-07-25 08:53:04
オリジナル
1054 人が閲覧しました
  1. $file = "temp.txt";
  2. $fp = fopen($file , 'w');
  3. if(flock($fp , LOCK_EX)){
  4. fwrite($fp , "abcn") ;
  5. sleep(10);
  6. fwrite($fp , LOCK_UN);
  7. 2) b.php
$file = "temp.txt"; $fp = fopen($fp , 100);コード

をコピーして a.php を実行した後、すぐに b.php を実行すると、出力が表示されます。 ABC a.php の実行が終了したら、b.php を実行すると、出力が表示されます。 ABC 123 明らかに、a.php がファイルを書き込むと、データが大きすぎて時間がかかります。このとき、b.php はデータを不完全に読み取ります。 上記の方法は、
php ファイル ロックの作成例チュートリアル
で紹介されています。理解できない場合は、記事内の例を参照して詳細を学ぶことができます。
  1. b.php を次のように変更します。
$file = "temp.txt";
$fp = fopen($file , 'r'); if(flock($fp , LOCK_EX)){ echo fread($fp , 100) ;
flock($fp , LOCK_UN);

} else{ echo "ファイルのロックに失敗しました...n"

a.php を実行した後, b.php をすぐに実行すると、b.php は a.php が完了するまで (つまり 10 秒後) 待ってから次のように表示されることがわかります。 ABC 123 データの読み取りは完了しましたが、時間が長すぎるため、書き込みロックが解除されるまで待たなければなりません。
b.php を次のように変更します。
  1. $file = "temp.txt";
  2. $fp = fopen($file , 'r');
  3. if(flock($fp , LOCK_SH | LOCK_NB)){
  4. echo fread($fp , 100);
  5. flock($fp, LOCK_UN);
  6. echo "ファイルのロックに失敗しました...n"
  7. fclose($fp);その後、すぐに b.php を実行すると、出力が表示されます。 ファイルのロックに失敗しました… 上記のように長時間待たずに、ロックファイル失敗ステータスを返せることが証明されました。
結論: ファイルをキャッシュするときは、関連するロックを選択することをお勧めします。そうしないと、読み取られたデータが不完全になったり、データが繰り返し書き込まれたりする可能性があります。 File_get_contents はデフォルトでどのようなロックを使用するのかわかりません。とにかく、ロックしないと得られる出力は不完全なデータと同じです。 ファイルのキャッシュを実行したいので、書き込みロックがあるかどうかを知る必要があるだけで、ある場合はデータベースをチェックするだけです。 テスト環境: Linux (Ubuntu 6)、PHP 5.1.2、Apache 2
再投稿: ファイル ロックには、共有ロックと排他ロック、つまり読み取りロック (LOCK_SH) と書き込みロック (LOCK_EX) の 2 種類があります。 ファイル ロックは通常次のように使用されます。

$fp = fopen("ファイル名", "a");

flock($fp, LOCK_SH) または die("ロックエラー")

$str = fread($fp, 1024); ($fp, LOCK_UN);
    コードをコピーします
  1. ファイルが更新される前に fwrite を待ってから fclose するのではなく、fwrite の後、ファイルはすぐに更新されることに注意してください。これは、fwrite の後、fclose の前にファイルを読み取ることで確認できます。

    しかし、lock_ex をいつ使用し、lock_sh をいつ使用するのでしょうか?

    1 つ目は、読書時: ダーティなデータを表示したくない場合は、lock_sh 共有ロックを使用するのが最善です。次の 3 つの状況が考えられます。 1. 読み取り時に共有ロックが追加されていない場合、他のプログラムが書き込みを行う場合は (書き込みがロックされているかどうかに関係なく)、書き込みは直ちに成功します。ちょうど半分が読み取られてから別のプログラムによって書き込まれる場合、読み取られた後半は前半と一致しない可能性があります (前半は変更前、後半は変更後です)。 2. 読み取り時に共有ロックが追加されている場合 (読み取りだけなので排他ロックを使用する必要はありません)、この時点で他のプログラムが書き込みを開始し、書き込みプログラムはロックを使用しません。プログラムを作成するとファイルが直接変更されるため、以前と同じ問題が発生します 3. 最も理想的な状況は、読み取り時にロック (lock_sh) し、書き込み時にロック (lock_ex) することです。この方法では、書き込みプログラムは読み取りプログラムが完了するのを待ってから動作するため、無謀な操作は発生しません。

    二番目に、書くとき: 複数の書き込みプログラムがロックなしでファイルに対して同時に動作する場合、最終データの一部はプログラム a によって書き込まれ、一部はプログラム b によって書き込まれる可能性があります。 書き込み時にロックされていて、この時点で別のプログラムがそれを読み取りに来た場合、何を読み取るでしょうか? 1. 読み取りプログラムが共有ロックを適用しない場合、ダーティ データを読み取ります。たとえば、プログラムを書く場合、a、b、c の 3 つの部分を書く必要があります。a を書いた後、このときに読み込むのは b です。次に、ab を書きます。このとき読み取れるのは abc です。 2. 読み取りプログラムが以前に共有ロックを申請したことがある場合、読み取りプログラムは書き込みプログラムが abc の書き込みを完了するまで待機し、読み取り前にロックを解放します。

    上記は PHP ファイル ロックの入門チュートリアルであり、比較分析を通じて PHP ファイル ロックの使用方法を詳しく説明しています。

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