キー読み書きキーのロックの問題

6009 ワード

ファイルの読み書き中にPHP関数flock()が使用されます.
操作の有効性と完全性を確保するために,ロック機構により同時状態を貫通状態に変換することができる.アプリケーションシーンを仮定します.大きな同時性がある場合、fwriteを介してファイルの末尾にデータを複数回秩序正しく書き込み、ロックをかけない場合は何が起こりますか?複数回の順序付けされた書き込み操作は、トランザクションに相当します.このトランザクションの整合性を保証する必要があります.
関数flock()

構文

flock(file,lock,block)

パラメータ
説明
file
必要です.ロックまたは解放する開いているファイルを指定します.
lock
必要です.どのロックタイプを使用するかを指定します.
block
オプション.1またはtrueに設定すると、ロック時に他のプロセスがブロックされます.

 


 


説明


flock()操作のfileは、すでに開いているファイルポインタでなければなりません.
lockパラメータは、次のいずれかの値で指定できます.
  • 共有ロック(読み込んだプログラム)を取得するにはlockをLOCK_にするSH(PHP 4.0.1以前のバージョンは1に設定).
  • 独占ロック(書き込みのプログラム)を取得するには、lockをLOCK_とするEX(PHP 4.0.1以前のバージョンでは2に設定されています).
  • ロックを解除するには(共有または排他にかかわらず)、lockをLOCK_に設定します.UN(PHP 4.0.1以前のバージョンでは3に設定されていた).
  • ロック時にflock()が詰まるのを望まない場合はlockにLOCK_を付けるNB(PHP 4.0.1以前のバージョンでは4に設定されていた).

  • 例:
    2つのファイルa.phpとb.phpを作成する
    <?php
    //a.php
    
    $file = "temp.txt";
    $fp = fopen($file,"w");
    if(flock($fp,LOCK_EX)){
        fwrite($fp,"abc\r
    "); sleep(10); fwrite($fp,"123\r
    "); flock($fp,LOCK_UN); } fclose($fp); ?> <?php //b.php $file = "temp.txt"; $fp = fopen($file,"r"); if(flock($fp,LOCK_SH)){ echo fread($fp,1024); flock($fp,LOCK_UN); }else{ echo " 。。。"; } fclose($fp); ?>

    a.phpを先に実行し、すぐにb.phpを実行すると、b.phpはa.phpの実行が完了した後(つまり大量のデータが完了した後)、b.phpはa.phpに書き込まれたデータを表示します.
    b.phpを次のように変更します.
    <?php
    $file = "temp.txt";
    $fp = fopen($file,"r");
    if(flock($fp,LOCK_SH|LOCK_NB)){
        echo fread($fp,1024);
        flock($fp,LOCK_UN);
    }else{
        echo " 。。。";
    }
    fclose($fp);
    ?>

    このとき同様の操作を行うと、b.phpがa.phpを待たずにデータを書き終わる(実行済み)とすぐに「ファイルが独占ロックされている...」
    結論:ファイルキャッシュを行うときは、関連ロックを選択します.そうしないと、読み取りデータが不完全になるか、データの書き込みが繰り返される可能性があります.(file_get_contentsのロックが不明で、上記の操作で不完全なデータが得られます.)
    複数回同時に実行され、100行も書かれていますが、トランザクション1とトランザクション2のデータが交錯して書き込まれるのは、私たちが望んでいる結果ではありません.トランザクションの完全な実行が必要です.ロックメカニズムflockが必要な場合、最初のトランザクションが実行された後に2番目のトランザクションが実行されることが保証されます.トランザクションがflockを実行すると、ここにLOCK_が追加されます.EX(排他ロック)では、リソースに対するすべての操作がブロックされます.トランザクションが実行されると、後続のトランザクションが実行されます.
    いつLOCK_を使いますかEX、いつLOCK_を使うかSHは?
    読むとき:dirtyデータが出たくない場合はLOCK_SH共有ロック.次の3つのケースが考えられます.
      1.読むときに共有ロックが付いていない場合は、他のプログラムが書くとすぐに成功します.ちょうど半分読んで、他のプログラムに書かれたら、読みの後半が合わない可能性があります(前半は修正前、後半は修正後).
      2.読むときに共有ロックを付けた場合(読むだけなので排他ロックや独占ロックを使う必要はありません)、このとき、他のプログラムが書き始め、この書き込みプログラムがロックを使っていない場合、書き込みプログラムが直接このファイルを修正し、前のような問題を引き起こすこともあります.
      3.最も理想的なのは、読むときに共有ロックLOCK_を付けることです.SHは、書く時にも独占ロックロックをかけるLOCK_EXは、このようにプログラムを書くと、読みプログラムが完了してから操作が行われ、むやみに操作することはありません.
    書くとき:複数の書き込みプログラムにロックをかけずにファイルを操作すると、最後のデータの一部がaプログラムで書かれ、一部がbプログラムで書かれている可能性があります.だから理想的なのは、上記の3つ目の点です.読むときに共有ロックロックロックロックロックロックをかけることです.SHは、書く時にも独占ロックロックをかけるLOCK_EX.