PHP が単一のプロセスによって実行されることは誰もが知っていますが、PHP のマルチプロセスの処理は主にサーバーのマルチプロセスまたは PHP-FPM とそのプロセスの再利用に依存しています。また、言うまでもなく、大量のデータを処理する場合やバックグラウンドの DEMON デーモンを実行する場合、特にバックグラウンド Cli モードでは、複数のプロセスの利点が非常に重要です。
PHP のマルチスレッドについても言及されていますが、プロセス内でのマルチスレッドのリソース共有と割り当ての問題は解決が困難です。 PHPにはマルチスレッド用の拡張子pthreadsもありますが、不安定でスレッドセーフな環境が必要と言われているため、あまり使われていません。
昔、PHPグループのマスターが、バックグラウンドPHPを進めたいならマルチプロセスを避けるべきだと指導したことがありますが、たまたま社内のデーモンプロセスもPHPのマルチプロセスを併用していました。 Gu Ge のさまざまな資料とマニュアルを参考にして、ようやくマルチプロセスを理解して小さなデモを書きました (Linux システムで実装)。間違いや漏れがあれば、ご指摘いただきありがとうございます。
PHPマルチプロセスを実装するには、pcntlとposixという2つの拡張機能が必要です。インストール方法はここでは説明しません。
PHP サブプロセスの作成はマルチプロセスの始まりです。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()
シグナルプロセッサをインストールして呼び出した後、子プロセスが対応するシグナルを親プロセスに返すと、親プロセスは対応するコールバック関数を呼び出して子プロセスを処理できます。
子プロセスを処理するメソッドは次のとおりです:
: この関数は、名前が示すとおりではありません。必要に応じて、子プロセスにプロセス終了シグナルを送信して子プロセスを終了することを選択できます。 : フォークの子プロセスのステータスを待つか返します。この関数が呼び出されたときに指定された子プロセスが終了している場合 (一般にゾンビ プロセスとして知られています)、この関数はすぐに戻り、子プロセスのすべてのシステム リソースを解放します。このプロセスは子プロセスを回避し、システム リソースの無駄を引き起こすゾンビ プロセスになる可能性があります。以下は 2 つの関数の関数プロトタイプです: posix_kill()
これは PHP マルチプロセスの基本的な使用方法です。興味があれば、自分でデモを作成して試してみることができます。
最後に、PHP マルチプロセスの利点についてバード兄弟が言ったことを投稿させてください:
ちなみに、別の例もあります。いつか github にアップロードします。>> ぜひ注目してください。
- 複数のプロセスを使用します。子プロセスが終了した後、カーネルがリソースをリサイクルします
- 複数のプロセスを使用すると、子プロセスが異常終了しても、プロセス全体のスレッドが終了することはありません。親プロセスもプロセスを再構築する機会があります。
常駐メインプロセスはタスクの分散のみを担当し、ロジックはより明確です。
参考:
PHP CLI モードのマルチプロセス アプリケーション - Fengxuezhiyu
予備的な PHP マルチプロセス プログラミング - PureWeber - Pure Internet
phpでデーモンプロセスを書く - Hu Chaoのブログ