ホームページ  >  記事  >  バックエンド開発  >  PHP でファイルをロックおよびロック解除する方法

PHP でファイルをロックおよびロック解除する方法

小云云
小云云オリジナル
2018-02-10 10:27:311487ブラウズ

プロジェクトでは、データベース クエリ ログ、アクセス ログ、外部インターフェイス リクエストのリターン パラメータ ログなどのログが一般的に使用されます。この記事では主に、PHP でファイル ロックをロックおよびロック解除する方法を分析例と組み合わせて紹介します。 、PHP でファイルをロックおよびロック解除するための実装方法とそれに関連する注意事項について説明します。必要な友人はそれを参考にしていただければ幸いです。


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

しかし、この書き方には欠陥があります。Web サイトに同時にアクセスするのは 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);

ファイルロック期間中は他のプロセスがファイルを操作できない例をテストしたい場合は、以下のデモを使用できます

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を実行すると、スリープ中にtest.phpが効果を達成できないことがわかります。

関連する推奨事項:

PHP はロックを通じて同時スナップアップ機能を実装します

MySQL ステートメントのロックを実装する方法

Mysql の高同時ロック トランザクション処理

以上がPHP でファイルをロックおよびロック解除する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。