PHPはファイルロックとプロセスロックを実装します

墨辰丷
リリース: 2023-03-26 17:18:02
オリジナル
2007 人が閲覧しました

この記事では主にPHPのファイルロックとプロセスロックの使用例を紹介していますが、編集者が非常に良いと思ったので、参考として共有します。編集者をフォローして一緒に見てみましょう

1. ファイルロック

  • flock()

  • fclose()

  • swoole_lock()

Poファイルロックの可能なアプリケーションシーン:

1. 同じファイルにアクセスして変更する必要がある複数のプロセスまたは複数のサーバーを制限します。

2. ビジネス ロジック内でのキューイングと人為的なブロック。ファイルの内容を保護するため、

以下はファイルロックC/S通信メカニズムの使用であり、特定の通信プロセスは省略されています

サーバー(サーバー通信プロセスは省略されています):

//监听数据发送事件
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
  $serv->send($fd, "ServerEnd");

  $p_file = "locktest.txt";
  var_dump(file_get_contents($p_file));
});
ログイン後にコピー

Client1(サーバー通信処理を省略しました):

$s_recv = "ww";

$p_file = "locktest.txt";

$o_file = fopen($p_file,'w+');
// flock()加锁方式:
flock($o_file,LOCK_EX);

// // swoole加锁方式:
// $lock = new swoole_lock(SWOOLE_FILELOCK, $p_file);
// $lock->lock();

fwrite($o_file, 'ss' . $s_recv);

sleep(30);
// 两种解锁方式
// flock($o_file, LOCK_UN);
// $lock->unlock();
ログイン後にコピー

Client2(サーバー通信処理を省略しました):

$s_recv = "xx";

$p_file = "locktest.txt";

$o_file = fopen($p_file,'w+');
// flock()加锁方式:
flock($o_file,LOCK_EX);

// // swoole加锁方式:
// $lock = new swoole_lock(SWOOLE_FILELOCK, $p_file);
// $lock->lock();


fwrite($o_file, 'ss' . $s_recv);

// 两种解锁方式
// flock($o_file, LOCK_UN);
// $lock->unlock();
ログイン後にコピー

結果:

Client2は30秒間ブロックされ、 Client1 の実行が終了するまでファイルは処理されませんでした。一度だけ書き込みます。

[l0.16@4 m29.5% c30s04] $ php swoole_client2.php
ログイン後にコピー

次のことに注意してください。プロセスが終了するとロックが解除されるため、デモで機能しなくても手動でのロック解除も正常に実行できるため、ファイル ロックの効果を観察するために最初のクライアントで sleep() 一時停止関数が実行されます。 flock() の標準的な解除方法は flock($file, LOCK_UN) ですが、個人的には将来のトラブルを避けるために fclose() が好きです;

2. プロセスロック


ファイルロックとは異なり、プロセスロックファイルへの I/O を防ぐためには使用されません。したがって、複数のプロセスが同時実行される場合はキューに入れる必要があります。つまり、キー ロジックの前に他の同時プロセスのロジックの実行をブロックする必要があります。プロセスの実行が終了します。

いくつかの実装アイデアがあります: 1. flock() ファイルロックを使用して一時的なロックファイルを作成し、LOCK_NB を使用してブロッキングフローまたは非ブロッキングフローをシミュレートします。プロセス内のロジック実行を制御します。

ノンブロッキング モデル デモ:

$p_file = "locktest.txt";
$o_file = fopen($p_file, 'w+');

// 如果临时文件被锁定,这里的flock()将返回false
if (!flock($o_file, LOCK_EX + LOCK_NB)) {
  var_dump('Process Locked');
}
else {
  // 非阻塞模型必须在flock()中增加LOCK_NB参数
  // 当然,这里取消LOCK_NB参数就是阻塞模型了
  flock($o_file, LOCK_EX + LOCK_NB);
  var_dump('Process Locking');
  // 模拟长时间的执行操作
  sleep(10);
}
ログイン後にコピー

2. プロセスが取得した後、swoole が提供する共有メモリ、キャッシュ メソッド、または通信メソッドを使用します。変数のステータス、判定条件を使用してロジックの実行を制御します。

変数を渡す方法はたくさんあります。ここではアイデアを提供するために、

ブロッキング モデルのデモを取り上げます。

ここで注意する必要があるのは:


1. memcached の有効期限は実際のプログラムの実行時間よりも短くすることはできないため、ロジックの実行が完了した後に少し長くしてリサイクルすることをお勧めします。

2. ノンブロッキングモデルでは、ステータスが false と判断された場合、ビジネスロジックの継続実行を回避するためにプロセスを終了またはブロックする必要があります

3 。実際のアプリケーションでは、これが必要です。再試行時間を設定すると、memcached の大量の I/O 同時実行性が大幅に削減され、サーバーの負荷が軽減されます。同時にファイルを書き込みます


php

ファイルロック
高い同時実行性を解決する


PHPを使用して高い同時性を解決する手順の詳細な説明
ファイルロック


以上がPHPはファイルロックとプロセスロックを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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