PHPマルチプロセスプログラミングのゾンビプロセス問題の理解

2503 ワード

PHPマルチプロセスプログラミングのゾンビプロセス問題の理解
pcntl_の使用fork関数はPHPにマルチプロセス同時または非同期処理の効果を実現させることができる://www.jb 51.net/article/125789.htm
問題は、私たちが生み出したプロセスを制御する必要があり、無視できないことです.最も基本的な方法はforkプロセスと殺しプロセスです.
pcntlを利用することでfork関数は、新しいサブプロセスを持っていますが、サブプロセスは次に処理する必要がある内容を完了します.では、まずサービス()と呼びましょう.また、多くのサービス()が処理する必要があります.これまでのニーズを再参照してください.親プロセスはプロファイルを繰り返し読み取り、ファイルの変更を待つ必要があります.pcntl_forkの方法では、簡単に次のコードを書くことができます.

$res = config();
//kill  
for($i = 0; $i < $res[sum]; $i++) {
  $pid = pcntl_fork();
  if ($pid == 0) {
    service();
    return;
  }
}

コードの注釈の場所は、コンフィギュレーションファイルで変更が発生したときにプロセスを殺す必要があります.プロセスを殺す方法は簡単です.killコマンドを使用して直接殺すことができます.例えば、pidを123と仮定します.

1 kill 123

しかし、私たちは発見して、このプロセスを殺す方法を使って本当にプロセスを殺していません.このサブプロセスが殺された後、このプロセスの資源を占有して、私たちはゾンビプロセスになって、ゾンビプロセスはkillコマンドを使って殺すことができません.この問題を解決するには、私たちができることは2つの方法しかありません.
1. shutdown
2.プロセスの親プロセスを殺します.
しかし、このプログラムの目的は、サーバ内に常駐していることを監視し、サーバを閉じることができず、親プロセスも乾かすことができないため、この2つの方法はできません.このときforkメソッドに関する公式ドキュメントの説明を見ました.

pcntl_wait($status); //       ,           。

ゾンビプロセスになるのを防ぐ方法がありましたが、公式サイトで提供されているコードはこうです.

$pid = pcntl_fork();
//               
if ($pid == -1) {
  //    :          -1.
   die('could not fork');
} else if ($pid) {
   //          ,             
   pcntl_wait($status); //       ,           。
} else {
   //      $pid 0,              。
}

どういう意味ですか.親プロセスはサブプロセスの実行を待機し、サブプロセスの実行が終了するまで次のステップが行われず、ゾンビプロセスも除去されます.しかし、ここではまた私たちのニーズと一致していません.私たちのサブプロセスはデッドサイクルのプログラムであり、絶えず出力を探しています.さらに、終了していないときは、同期ではなく非同期処理が必要です.でもこの方法は使えますか?もちろんいいです.
pcntl_waitのドキュメントでは、この関数を説明しています.
wait関数は、サブプロセスが終了するか、信号が受信されるまで、現在のプロセスを中断するか、信号処理関数を呼び出すまで、現在のプロセスの実行を開始する.サブプロセスがこの関数を呼び出したときに終了した場合(ゾンビプロセスと呼ばれます)、この関数はすぐに戻ります.サブプロセスで使用されているすべてのシステムリソースが解放されます.waitのシステムでの作業の詳細については、システムのwait(2)マニュアルを参照してください.
この関数は、サブプロセスがゾンビプロセスになったことを発見すると、ゾンビプロセスのリソースを解放することを発見しました.前提は、このゾンビプロセスがこの親プロセスのサブプロセスであることです.ゾンビプロセスからリソースを解放するには、この方法を巧みに利用することができます.そのため、次のコードがあります.

 posix_kill(123, 9);
 pcntl_wait($status);

これでkillを使ってこのプロセスを乾かすと、このプロセスはもう実行されませんが、このプロセスはゾンビプロセスになり、リソースを占有しています.次の文でpcntl_を実行します.wait()はこれらのゾンビプロセスに資源を解放させ、このようにして、サブプロセスは本当に終了され、ゾンビプロセスは解消されます.
もし疑問があれば伝言を残してあるいは当駅のコミュニティに行って討論を交流して、読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!