この記事では主に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 が提供する共有メモリ、キャッシュ メソッド、または通信メソッドを使用します。変数のステータス、判定条件を使用してロジックの実行を制御します。
変数を渡す方法はたくさんあります。ここではアイデアを提供するために、
ブロッキング モデルのデモを取り上げます。ここで注意する必要があるのは:
2. ノンブロッキングモデルでは、ステータスが false と判断された場合、ビジネスロジックの継続実行を回避するためにプロセスを終了またはブロックする必要があります
3 。実際のアプリケーションでは、これが必要です。再試行時間を設定すると、memcached の大量の I/O 同時実行性が大幅に削減され、サーバーの負荷が軽減されます。同時にファイルを書き込みますファイルロック
高い同時実行性を解決する
PHPを使用して高い同時性を解決する手順の詳細な説明
ファイルロック
以上がPHPはファイルロックとプロセスロックを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。