PHPによるファイルロックのロック解除・ロック解除操作の実現方法

1884 ワード

本明細書の例では、PHPがファイルロックをロック解除、ロック解除する方法を実装する方法について説明する.皆さんの参考にしてください.具体的には以下の通りです.
プロジェクトでは、データベースクエリーログ、アクセスログ、対外インタフェース要求パラメータログなどのログが一般的に使用され、ログを処理する際の簡単な書き方は以下の通りです.

$file = 'log.txt';
$fp = fopen($file, 'a+');
if(!is_writable($file)){
  die("The $file is not writable!");
}
fwrite($fp, 'here');
fclose($fp);


しかし、この書き方は瑕疵で、1つのサイトが同じ時間に1人のユーザーだけがアクセスするわけではありません.複数のユーザーが同時にアクセスすると、問題が発生します.つまり、複数のプロセスが同じリソースを使用している場合、前のプロセスが半分に書かれた後のプロセスが書き始め、最後に生成されたログが乱れます.この場合、ロックに使用されます.ファイルのロック中、他のプロセスではファイルは変更されません.ファイルがロック解除された場合にのみ操作できます.書き方は以下の通り

$file = 'log.txt';
$fp = fopen($file, 'a+');
if(!is_writable($file)){
  exit("The $file is not writable!");
}
flock($fp, LOCK_EX);//   
fwrite($fp, 'here');
flock($fp, LOCK_UN);//   
fclose($fp);

ファイルのロック中に他のプロセスがファイルを操作できない例をテストしたい場合は、次のdemoを使用します.
log.php

$file = 'log.txt';
$fp = fopen($file, 'a+');
if(!is_writable($file)){
  exit("The $file is not writable!");
}
flock($fp, LOCK_EX);
fwrite($fp, 'here');
sleep(10);
flock($fp, LOCK_UN);
fclose($fp);

test.php

$file = 'lock.txt';
$fp = fopen($file, 'a');
fwrite($fp, 'good'); //  sleep      
fclose($fp);
//              ,   sleep        
//var_dump(file_get_contents($file));

テスト時に、まずlogを実行します.php、testを再実行します.php、sleepの間、test.phpは実行しても効果がありません.
PHPに関する内容についてもっと兴味のある読者は、「phpファイル操作総括」、「PHP常用遍歴アルゴリズムとテクニック総括」、「PHPデータ构造とアルゴリズム教程」、「phpプログラム设计アルゴリズム総括」、「PHP配列(Array)操作テクニック大全」、「php文字列(string)用法総括」、「phpよくあるデータベース操作テクニック総括」
ここで述べたことが皆さんのPHPプログラム設計に役立つことを願っています.