ホームページ >バックエンド開発 >PHPチュートリアル >PHPマルチプロセスにおけるpcntl_forkの詳細な紹介

PHPマルチプロセスにおけるpcntl_forkの詳細な紹介

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

この記事は、PHP マルチプロセス編集の pcntl_fork 例の詳細な説明に関する関連情報を主に紹介します。この記事が、この部分の内容を理解して習得するのに役立つことを願っています。

PHP マルチプロセス。プロセス編集 pcntl_fork の例の詳細な説明

実は、PHP は同時実行をサポートしていますが、使用されることはほとんどありません。最も一般的に使用される方法は、PHP-FMP を使用して php プロセスをスケジュールすることです。

ただし、PHP の使用は Web 開発に限定されず、システム ツールのプログラミング、監視、運用保守にも使用できます。これらの指示を使用すると、同時実行 (マルチプロセス)、ソケット プログラミングなどの PHP の機能をさらに使用できるようになります。

それでは、私が出会った PHP マルチプロセス プログラミングについて話しましょう。このマルチプロセスの使用には背景があります。その背景については以下に漠然と説明します。

もちろん PHP 言語を使用した監視システムが必要です。監視システムは、各監視インジケーターが独自の処理に集中できるようにするために、インジケーターを監視するために別のプロセスを使用する必要があります。設定を取得した後、設定に従って各プロセスを起動する処理もあります。

つまり、これには私がマルチプロセスと呼ぶものが必要です。

  1. まず、構成情報を読み取るために使用されるメインプロセスを開始します。たとえば、5 つのインジケーターを監視する必要があると読みました

  2. その後、メインプロセスは、これら 5 つのインジケーターをそれぞれ監視するために 5 つのサブプロセスを開始します。

  3. 5つの指標監視プロセスを作成した後、メインプロセスは監視設定を実行します。

  4. 構成を変更したら、前のプロセスを強制終了し、プロセスを再作成します。

比較的明確なロジック。次に、操作を単純化してみましょう。簡単に言うと、メイン プロセスは 5 つのサブプロセスを作成します。

まず、プロセスを作成するには、PHP の関数である pcntl_fork() を使用する必要があります。この関数に馴染みのない学生もいるかもしれませんが、Linux C プログラミングに触れたことがある人は、この関数があることを知っています。 Linux では fork() と呼ばれ、子プロセスを作成するために使用されます。この関数は、Linux でのこの関数と同じ意味を持ちます。この機能は Linux でのみ使用でき、pcntl 拡張機能がインストールされている必要があることに注意してください。

この関数の使用方法については、公式ドキュメントを確認できます: http://php.net/manual/zh/function.pcntl-fork.php

公式ドキュメントには次のように書かれています:

pcntl_fork()関数 PID (プロセス ID) と PPID (親プロセス ID) のみが親プロセスと異なる子プロセスを作成します。システム上での fork の動作の詳細については、システムの fork(2) マニュアルを参照してください。

成功すると、親プロセス実行スレッドには生成された子プロセスのPIDが、子プロセス実行スレッドには0が返されます。失敗すると、親プロセス コンテキストで -1 が返され、子プロセスは作成されず、PHP エラーが発生します。

このようにして、子プロセスを作成することができます。子プロセスが正常に作成されると、pcntl_fork()以降のメソッドが実行されます。では、この関数の戻り値をどのように理解すればよいでしょうか?

これは、関数を呼び出してプロセスを作成するときに、関数が実行される時間があり、関数の実行の開始と終了の間に新しいプロセスが作成されます。この関数も実行されるため、関数には戻り値も必要です。関数が一度実行されると、親プロセスと子プロセスの両方が関数の戻り値を受け取ります。親プロセスは子プロセスを作成しますが、子プロセスは新しいプロセスを作成しないため、子プロセスは何も持ちません。この関数からの結果が返されるため、彼には 0 が割り当てられました。親プロセスは子プロセスを作成し、子プロセスはpidを持っているので、そのプロセスのpidを取得します。

次のことを確認するプログラムを作成できます:


$pid = pcntl_fork();
var_dump($pid);

この呼び出しは 2 つの値を出力しますが、直接出力すると、子プロセスの PID である 1 つの値しか表示されませんが、var_dump を使用すると、 0 と子プロセスの pid という 2 つの値が表示されます。値 0 が子プロセスによって返されます。

プロセスの作成方法を理解したら、プロセスの作成を開始できます。プロセスを 5 つ作成する必要があるので、5 回ループしてプロセスを作成します。次のコードを取得します:


 $i=0;
 while($i!=5){
  $pid = pcntl_fork();
  echo $pid."---------hahah".$i++.PHP_EOL;
 }

それでは、実行しましょう。ああ?プロセスが 5 つではないことがわかりました。プロセスがたくさんあることがわかりました。hahah4 の最後の出力は 32 でした。なぜ 32 なのでしょうか。計算してみましょう。 2^5=32、最終的なスレッド数が指数関数的に増加したのはなぜですか?

これを見つけるのは難しいことではありません。後続のすべてのユーザーが while ループを実行し、最終的にはプロセスが指数関数的に増加するためです。つまり、fork 時に while ループも導入されます。ただし、必要なプロセスは 5 つだけです。どうやってするの?

関数に関する以前の研究により、子プロセスが値 0 を返すことがわかり、0 が子プロセスのマークであることがわかります。子プロセスをマークすることで、プロセスの実行を終了できます。したがって、コードを次の形式に変更できます:


$i=0;
while($i!=5){
 $pid = pcntl_fork();
 echo $pid."---------hahah".$i++.PHP_EOL;
 if ($pid == 0) {
  echo "子进程".PHP_EOL;
  return;
 }
}

因为0其实是对子进程的标记,那么pid这个变量在子进程里实际上是0的,所以当发现pid的值为0的时候,我们就可以断定我们当前进程为一个子进程,不需要在让他执行while并创建子进程的子进程了,所以在执行完我们的内容之后就return或者exit退出这个执行就好了。这样就能保证我们执行创建了5个进程而不是32个了。

以上がPHPマルチプロセスにおけるpcntl_forkの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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