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

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

Dreamweaver Mac版
ビジュアル Web 開発ツール

MinGW - Minimalist GNU for Windows
このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません
