ホームページ  >  記事  >  バックエンド開発  >  PHPマルチプロセスにおけるゾンビプロセス問題の解決方法を詳しく解説

PHPマルチプロセスにおけるゾンビプロセス問題の解決方法を詳しく解説

黄舟
黄舟オリジナル
2017-10-16 09:11:451783ブラウズ

この記事は、PHP マルチプロセス プログラミングにおけるゾンビ プロセスの問題を理解するための関連情報を主に紹介します。この記事が、この部分の内容を習得するのに役立つことを願っています。

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

pcntl_fork 関数を使用すると、PHP でマルチプロセスの同時実行または非同期処理の効果を実現できます: http://www.jb51.net/article/125789.htm

それでは、問題は私たちが生成するプロセスは無視するのではなく、制御する必要があるということです。最も基本的な方法は、プロセスをフォークしてプロセスを強制終了することです。

pcntl_fork 関数を使用すると、すでに新しいサブプロセスがあり、そのサブプロセスが処理する必要があるものを完了します。そのため、当面はこれを service() と呼びます。処理、再び前の要件を参照すると、親プロセスはループ内で構成ファイルを読み取り、ファイルが変更されるのを待つ必要があります。 pcntl_fork を使用すると、次のコードを簡単に作成できます。


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

コード内のコメントで、設定ファイルが変更されたときにプロセスを強制終了する方法は非常に簡単です。たとえば、直接 kill する kill コマンド (pid が 123 であると仮定):


1 kill 123

ただし、プロセスを強制終了するこの方法を使用しても、子プロセスが強制終了された後も実際には強制終了されないことがわかりました。このプロセスのリソースを占有することにより、ゾンビ プロセスは kill コマンドを使用して強制終了できなくなります。この問題を解決できる方法は 2 つしかありません。

1. シャットダウン

2. このプロセスの親プロセスを強制終了します。

しかし、このプログラムの目的はサーバーを監視してサーバーに常駐させることなので、サーバーをシャットダウンすることはできず、親プロセスを強制終了することもできないため、これらの方法はどちらも機能しません。この時点で、公式ドキュメントで fork メソッドの説明を見ました:


pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。

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


$pid = pcntl_fork();
//父进程和子进程都会执行下面代码
if ($pid == -1) {
  //错误处理:创建子进程失败时返回-1.
   die(&#39;could not fork&#39;);
} else if ($pid) {
   //父进程会得到子进程号,所以这里是父进程执行的逻辑
   pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
} else {
   //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
}

毛織物ってどういう意味ですか?つまり、親プロセスは子プロセスの実行を待ち、子プロセスの実行が完了すると次のステップに進み、ゾンビ プロセスも削除されます。しかし、これは私たちのニーズを満たしていません。私たちのサブプロセスは出力を常に検索する無限ループ プログラムであり、更新は完了せず、必要なのは同期ではなく非同期処理です。しかし、この方法は使えるのでしょうか?実際にはもちろんできます。

この関数は、pcntl_wait ドキュメントで説明されています:

wait 関数は、子プロセスが終了するか、現在のプロセスの中断または信号処理関数の呼び出しを要求するシグナルを受信するまで、現在のプロセスの実行をスクレイピングします。 この関数を呼び出したときに子プロセス (一般にゾンビ プロセスとして知られる) が終了した場合、この関数はすぐに戻ります。子プロセスによって使用されていたすべてのシステム リソースが解放されます。システム上で待機がどのように機能するかについての詳細な仕様については、システムの wait(2) マニュアルを参照してください。

この関数は、子プロセスがゾンビプロセスになったことを検出すると、ゾンビプロセスが親プロセスの子プロセスである場合に、ゾンビプロセスのリソースを解放することがわかりました。次に、このメソッドを賢く使用して、これらのゾンビ プロセスにリソースを解放させることができるので、次のコードができます:


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

このように、最初に kill を使用してプロセスを強制終了し、プロセスは再度実行されなくなります。このプロセスはゾンビ プロセスになり、リソースを占有します。次の文では、pcntl_wait() を実行して、これらのゾンビ プロセスにリソースを解放させます。これにより、子プロセスが完全に終了し、ゾンビ プロセスが削除されます。

以上がPHPマルチプロセスにおけるゾンビプロセス問題の解決方法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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