ホームページ > バックエンド開発 > PHPチュートリアル > PHPSocketプログラミングにおけるマルチプロセスエコーサーバーの詳細な紹介(画像とテキスト)

PHPSocketプログラミングにおけるマルチプロセスエコーサーバーの詳細な紹介(画像とテキスト)

不言
リリース: 2023-04-04 07:30:02
オリジナル
1559 人が閲覧しました

この記事は、PHPSocket プログラミングにおけるマルチプロセス エコー サーバーについて詳しく (写真とテキストで) 紹介します。一定の参考価値があります。必要な友人は参照できます。お役に立てれば幸いです。

最後の echo サービス プログラムには大きな欠点があります。つまり、同時に 1 つのクライアントにしか接続できないということですが、これは明らかに不合理です。

そこで、今回はマルチプロセスアプローチを使用して、複数のクライアントに同時にサービスを提供します。

最終的な効果は次のとおりです:

PHPSocketプログラミングにおけるマルチプロセスエコーサーバーの詳細な紹介(画像とテキスト)

(作成したワーカー プロセスは ps コマンドで表示できます)

PHPSocketプログラミングにおけるマルチプロセスエコーサーバーの詳細な紹介(画像とテキスト)

##(xshell を介して複数のターミナルを開き、複数のクライアントをサービス プログラムに接続します)


コーディングを開始する前に、プロセスとは何かを紹介しましょう。

プロセス、つまりメモリを占有する実行中のプログラムは、独立したメモリ空間です。たとえば、Windows でメモ帳ソフトウェアを開くとき、この操作はプロセスを開くことと同じです。

マルチプロセスとは、一つのことを完成させるために複数のプロセスを作成することです。

今回はサーバー側プログラムのみを実装する必要があり、クライアントは以前のプログラムを引き続き使用します。以前の記事を読んでいない場合は、過去の記事をチェックしてください。

PHP では、pcntl_fork 関数を使用してプロセスを作成できます。

以下は関数のプロトタイプです:

int pcntl_fork ( void )
ログイン後にコピー

正式な説明:

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

これが親プロセスによって実行されるスレッドであると言われるのはなぜですか? プロセスには少なくとも 1 つのスレッドが含まれており、このスレッドがプロセスのメイン スレッドであるためです。

親プロセスが pcntl_fork を呼び出すと、独立した子プロセスもコピーされます。この子プロセスは親プロセスと同じコンテキストを持ちます。言い換えれば、2 つのプロセスは同じコードを共有しているだけです。

エンコードプロセスを入力します:

PHPSocketプログラミングにおけるマルチプロセスエコーサーバーの詳細な紹介(画像とテキスト)

pcntl_fork関数を実行すると、子プロセスも同時にコピーされます。コンテキストが親プロセスの実行環境の場合、戻り値は子プロセスのプロセス番号です。子プロセスの実行環境の場合は0を返します。したがって、次の if プログラム構造では、両方の分岐が実行されます。

子プロセスには以前と同じロジックがあり、クライアントからのメッセージの受信とクライアントへの送信を同時に行うために使用されます。

最後から 2 番目の行は、pcntl_waitpid 関数を呼び出します。この関数を説明する前に、まずゾンビ プロセスとは何かを理解しましょう。

通常の状況では、子プロセスは親プロセスを通じて作成されます。プロセスは独立したメモリ構造であるため、親プロセスは子プロセスの実行ステータスを知りません。子プロセスがタスクを完了した後、それ自体で終了することはできません。このとき、親プロセスは、子プロセスをリサイクルするためにオペレーティング システムを通じて子プロセスのステータスを取得する必要があります。そうしないと、子プロセスがガベージ リソース、つまりゾンビ プロセスになってしまいます。

以下はこの関数の関数プロトタイプです:

int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] )
ログイン後にコピー

正式な説明:

フォークの子プロセスの状態を待つか返します。

実は、上記のコードには問題があり、foreach で初めて pcntl_waitpid を呼び出した後、メイン プロセスは実際にはこの時点でブロックされ、最初の子プロセスが終了するまで待機し、その間に他の子プロセスが終了します。このとき異常終了するとメインプロセスで再利用されず、ゾンビプロセスが生成されます。実際の開発では、メインプロセスは依然として他のことを行う必要があります。

そこで、ここではノンブロッキング方式を推奨します。これは非常に簡単で、3 番目のパラメータ WNOHANG を追加するだけです。つまり: pcntl_waitpid ($pid, $status, WNOHANG)

この方法では、子プロセスを終了せずにすぐに戻ることができるため、後続のコードの実行を継続できます。

関連する推奨事項:

サーバーサイド PHP マルチプロセス プログラミングの実践

サーバーサイド PHP マルチプロセス プログラミングpractice_PHP チュートリアル

以上がPHPSocketプログラミングにおけるマルチプロセスエコーサーバーの詳細な紹介(画像とテキスト)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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