ホームページ > php教程 > php手册 > PHP マルチプロセッシングの概要

PHP マルチプロセッシングの概要

WBOY
リリース: 2016-07-21 14:52:59
オリジナル
1124 人が閲覧しました

準備する

PHP が単一のプロセスによって実行されることは誰もが知っていますが、PHP のマルチプロセスの処理は主にサーバーのマルチプロセスまたは PHP-FPM とそのプロセスの再利用に依存しています。また、言うまでもなく、大量のデータを処理する場合やバックグラウンドの DEMON デーモンを実行する場合、特にバックグラウンド Cli モードでは、複数のプロセスの利点が非常に重要です。

PHP のマルチスレッドについても言及されていますが、プロセス内でのマルチスレッドのリソース共有と割り当ての問題は解決が困難です。 PHPにはマルチスレッド用の拡張子pthreadsもありますが、不安定でスレッドセーフな環境が必要と言われているため、あまり使われていません。

昔、PHPグループのマスターが、バックグラウンドPHPを進めたいならマルチプロセスを避けるべきだと指導したことがありますが、たまたま社内のデーモンプロセスもPHPのマルチプロセスを併用していました。 Gu Ge のさまざまな資料とマニュアルを参考にして、ようやくマルチプロセスを理解して小さなデモを書きました (Linux システムで実装)。間違いや漏れがあれば、ご指摘いただきありがとうございます。

PHPマルチプロセスを実装するには、pcntlとposixという2つの拡張機能が必要です。インストール方法はここでは説明しません。


子プロセスを作成する

PHP サブプロセスの作成はマルチプロセスの始まりです。pcntl_fork() 関数が必要です。

fork関数の詳しい説明

pcntl_fork() — 現在のプロセスの現在位置でフォーク (子プロセス) を生成します。この関数が新しい子プロセスを作成した後、子プロセスは親プロセスの現在のコンテキストを継承し、取得される pcntl_fork() の戻り値が異なることを除いて、親プロセスと同様に pcntl_fork() 関数から下位の実行を続行します。戻り値を判断することで親プロセスと子プロセスを区別し、親プロセスと子プロセスに異なる論理処理を割り当てることができます。

pcntl_fork() 関数が正常に実行されると、親プロセス内の子プロセスのプロセス ID (pid) が返されます。システムの最初のプロセス初期プロセスの pid は 1 であるため、後続のプロセスの pid は 1 になります。このプロセスよりも大きいので、pcntl_fork を判断できます。() の戻り値は 1 より大きく、現在のプロセスが親プロセスであることを確認します。

子プロセスでは、この関数の戻り値は固定値0になります。また、pcntl_fork()の戻り値が0であると判断して子プロセスを決定することもできます。

pcntl_fork()関数の実行に失敗すると、親プロセスでは-1が返され、当然子プロセスは生成されません。

フォークプロセスインスタンス

以下は、子プロセスをフォークする簡単な例です:

リーリー

ここで 2 つの関数を紹介しましょう:

: 現在のプロセスの pid を取得します;

posix_getpid(): 現在のプロセスにわかりやすい名前を付けます。

この例を実行すると、現在の 2 つの PHP プロセスが表示されます。 cli_set_process_title('响亮的名字')

子プロセスを管理する


プロセスが作成された後、子プロセスを管理するにはどうすればよいですか?信号を使用します。

コンピューター サイエンスにおいて、シグナルは、Unix、Unix 類似のオペレーティング システム、およびその他の POSIX 準拠のオペレーティング システムにおけるプロセス間通信の制限された方法です。これは、イベントが発生したことをプロセスに通知するために使用される非同期通知メカニズムです。

信号プロセッサを配布する

子プロセスからのシグナルを親プロセスで受け取り、子プロセスの状態を判断することで子プロセスを管理します。

親プロセスで

関数を使用して、各子プロセスにシグナル ハンドラーをインストールする必要があります。

リーリー pcntl_signal()函数和pcntl_signal_dispatch()

PHP の一般的な信号定数は次のとおりです:
リーリー

シグナルプロセッサをインストールして呼び出した後、子プロセスが対応するシグナルを親プロセスに返すと、親プロセスは対応するコールバック関数を呼び出して子プロセスを処理できます。
子プロセスの処理

子プロセスを処理するメソッドは次のとおりです:

: この関数は、名前が示すとおりではありません。必要に応じて、子プロセスにプロセス終了シグナルを送信して子プロセスを終了することを選択できます。

: フォークの子プロセスのステータスを待つか返します。この関数が呼び出されたときに指定された子プロセスが終了している場合 (一般にゾンビ プロセスとして知られています)、この関数はすぐに戻り、子プロセスのすべてのシステム リソースを解放します。このプロセスは子プロセスを回避し、システム リソースの無駄を引き起こすゾンビ プロセスになる可能性があります。

以下は 2 つの関数の関数プロトタイプです: posix_kill()

リーリー


まとめ

これは PHP マルチプロセスの基本的な使用方法です。興味があれば、自分でデモを作成して試してみることができます。

最後に、PHP マルチプロセスの利点についてバード兄弟が言ったことを投稿させてください:

  1. 複数のプロセスを使用します。子プロセスが終了した後、カーネルがリソースをリサイクルします
  2. 複数のプロセスを使用すると、子プロセスが異常終了しても、プロセス全体のスレッドが終了することはありません。親プロセスもプロセスを再構築する機会があります。
  3. 常駐メインプロセスはタスクの分散のみを担当し、ロジックはより明確です。
ちなみに、別の例もあります。いつか github にアップロードします。>> ぜひ注目してください。

参考:

PHP CLI モードのマルチプロセス アプリケーション - Fengxuezhiyu

予備的な PHP マルチプロセス プログラミング - PureWeber - Pure Internet

phpでデーモンプロセスを書く - Hu Chaoのブログ

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