ホームページ > バックエンド開発 > PHPチュートリアル > PHPファイルロックとプロセスロックの解析例

PHPファイルロックとプロセスロックの解析例

小云云
リリース: 2023-03-19 18:34:02
オリジナル
1709 人が閲覧しました

以前のswooleの紹介を踏まえて、swooleのサーバー/クライアントとマルチプロセスの仕組みを使ってロックについて説明していきます。 ここでは主にPHPのファイルロックとプロセスロックの使用例を紹介します。 SQL ロックにはさまざまな機能とアプリケーション シナリオがあるため、それについては個別に説明します。

1. ファイルロック

  • flock()

  • fclose()

  • swoole_lock()

ファイルロックの可能な適用シナリオは次のとおりです:

1.サーバーは同じファイルにアクセスして変更する必要があります

2. ファイル I/O に関係するプロセスをキューに入れて人為的にブロックする

以下は、ロックC/S通信機構で使用する場合、特定の通信処理が省略されたファイル

Server (サーバ通信処理が省略):

//监听数据发送事件
$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
ログイン後にコピー
次のことに注意してください:

1. flock()でもswooleでもswoole_lock()はプロセス終了時に自動的にロックを解除する仕組みになっているため、デモでは手動でロックを解除しなくても正常に動作します。ファイルロックの影響を観察する最初のクライアント;

2. 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 を例に挙げます。例;

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

// 初始化memcached
$memcached = new Memcache;
$memcached->connect("localhost", 11211);

// 获取用来做状态判定的全局变量
$s_flag = $memcached->get("flag");

if (!$s_flag) {
  // 这里利用了memcached的过期时间作为演示,实际上业务处理完成后销毁该变量即可
  $memcached->set("flag", "locked", 0, 10);
  main();
}
else {
  // 阻塞模型
  while ($s_flag == 'locked') {
    var_dump('Process locked, retrying...');
    // 设置重试时间, 避免过于频繁的操作尝试
    sleep(1);
    // 更新状态变量
    $s_flag = $memcached->get("flag");
  }
  // // 非阻塞模型
  // if ($s_flag == 'locked') {
  //   var_dump('Process locked, suspended');
  //   die();
  // }
  main();
}

// 模拟业务主函数
function main() {
  var_dump('Process Running');
  // 业务执行结束后回收memcached
  // $memcached->delete("flag");
}
ログイン後にコピー

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


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

2. ノンブロッキングモデルでは、ステータスが false と判断された場合、ビジネスロジックの継続的な実行を避けるためにプロセスを一時停止またはブロックする必要があります。実際のアプリケーションでは、再試行時間を設定する必要があります。これにより、memcached の大量の I/O 同時実行性が大幅に削減され、サーバーの負荷が軽減されます。


関連する推奨事項: ファイル ロック、ミューテックスの詳細な説明PHP のロック、および読み取り/書き込みロック


PHP ファイル ロックとプロセス ロックの簡単な紹介


PHP のファイル ロックとプロセス ロックの違いを比較する

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

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