ホームページ バックエンド開発 PHPチュートリアル php-FPMプロセスプール探索の詳細な説明

php-FPMプロセスプール探索の詳細な説明

Oct 18, 2017 am 09:25 AM
php php-fpm 詳しい説明

次のエディターは、PHP-FPM に基づいたプロセス プールの探索を提供します。編集者はこれがとても良いと思ったので、参考として共有します。エディターに従って見てみましょう

PHP はマルチプロセスをサポートしていますが、マルチスレッドはサポートしていません。PHP-FPM はプロセス プール内で複数のサブプロセスを実行して、すべての接続リクエストを同時に処理します。次のように ps を介して PHP-FPM プロセス プール (pm.start_servers = 2) のステータスを表示します:


root@d856fd02d2fe:~# ps aux -L
USER  PID LWP %CPU NLWP %MEM VSZ RSS TTY  STAT START TIME COMMAND
root   1  1 0.0 1 0.0 4504 692 ?  Ss 13:10 0:00 /bin/sh /usr/local/php/bin/php-fpm start
root   7  7 0.0 1 0.4 176076 19304 ?  Ss 13:10 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
www-data  8  8 0.0 1 0.2 176076 8132 ?  S 13:10 0:00 php-fpm: pool www
www-data  9  9 0.0 1 0.2 176076 8132 ?  S 13:10 0:00 php-fpm: pool www
root  10 10 0.0 1 0.0 18376 3476 ?  Ss 14:11 0:00 bash
root  66 66 0.0 1 0.0 34420 2920 ?  R+ 15:13 0:00 ps aux -L
ログイン後にコピー

リストからわかるように、プロセス内に 2 つのアイドル状態の子プロセス PID 8 と PID があります。プールwww 9.注: NLWP は、軽量プロセスの数、つまりスレッドの数を指します。

PHP-FPM (FastCGI プロセスマネージャー) とは何ですか? PHP-FPM は、メモリとプロセスを効果的に制御し、マスター プロセスをメモリ上に常駐させて PHP 設定をスムーズにリロードできる、PHP-CGI のプロセス管理方法を提供します。 FastCGI は、言語に依存しないスケーラブルなアーキテクチャの CGI オープン拡張機能であり、その主な動作は、フォークして実行するのではなく、CGI インタープリタ プロセスをメモリ内に長時間保持することで、より高いパフォーマンスを実現します。 FastCGI は分散展開をサポートしており、WEB サーバー以外の複数のホストに展開できます。

調査方法: マルチスレッドの同時実行をシミュレートします

1. スレッドとは:スレッドは、通常、スレッド ID、現在の命令ポインター (PC)、レジスターで構成される軽量プロセス (LWP) とも呼ばれます。コレクションとスタックで構成され、プロセス内のエンティティであり、スレッド自体はシステム リソースを所有せず、動作に必要な一部のリソースのみを所有します。同じプロセスに属する他のスレッドを持つプロセス。 スレッド間の相互制約により、スレッドの動作に不連続性が見られます。スレッドには、準備完了、ブロック済み、実行中の 3 つの基本状態もあります。プロセスがリソース所有者であるため、作成、キャンセル、切り替えのオーバーヘッドが高すぎるため、対称型マルチプロセッサ (SMP) 上で複数のスレッド (スレッド) を同時に実行する方が適切な選択です。スレッド エンティティには、プログラム、データ、およびスレッド制御ブロック (TCB) が含まれます:

(1) スレッドのステータス

(2) スレッドが実行されていないときに保存されるオンサイト リソース


(3) 実行スタックのセット


(4) 各スレッドのローカル変数を格納するメインメモリ


(5) 同一プロセス内のメインメモリとその他のリソースにアクセスします。


ただし、複数のプロセスを使用すると、プロセス プール内のプロセスがクラッシュしたり攻撃された場合にアプリケーションがより堅牢になります。

2. マルチスレッドをシミュレートします:

<?php
/**
 * PHP 只支持多进程不支持多线程。
 *
 * PHP-FPM 在进程池中运行多个子进程并发处理所有连接,
 * 同一个子进程可先后处理多个连接请求,但同一时间
 * 只能处理一个连接请求,未处理连接请求将进入队列等待处理
 *
 */

class SimulatedThread
{
 //模拟线程
 private $thread;

 //主机名
 private $host = &#39;tcp://172.17.0.5&#39;;

 //端口号
 private $port = 80;

 public function __construct()
 {
  //采用当前时间给线程编号
  $this->thread = microtime(true);
 }

 /**
  * 通过socket发送一个新的HTTP连接请求到本机,
  * 此时当前模拟线程既是服务端又是模拟客户端
  *
  * 当前(程序)子进程sleep(1)后会延迟1s才继续执行,但其持有的连接是继续有效的,
  * 不能处理新的连接请求,故这种做法会降低进程池处理并发连接请求的能力,
  * 类似延迟处理还有time_nanosleep()、time_sleep_until()、usleep()。
  * 而且sleep(1)这种做法并不安全,nginx依然可能出现如下错误:
  * “epoll_wait() reported that client prematurely closed connection,
  * so upstream connection is closed too while connecting to upstream”
  *
  * @return void
  */
 public function simulate()
 {
  $run = $_GET[&#39;run&#39;] ?? 0;
  if ($run++ < 9) {//最多模拟10个线程
   $fp = fsockopen($this->host, $this->port);
   fputs($fp, "GET {$_SERVER[&#39;PHP_SELF&#39;]}?run={$run}\r\n\r\n");
   sleep(1);//usleep(500)
   fclose($fp);
  }

  $this->log();
 }

 /**
  * 日志记录当前模拟线程运行时间
  *
  * @return void
  */
 private function log()
 {
  $fp = fopen(&#39;simulated.thread&#39;, &#39;a&#39;);
  fputs($fp, "Log thread {$this->thread} at " . microtime(true) . "(s)\r\n");

  fclose($fp);
 }
}

$thread = new SimulatedThread();
$thread->simulate();
echo "Started to simulate threads...";
ログイン後にコピー

調査の概要: 上記のスクリプトを実行した後、予想通りの結果がいくつか見つかりました

PHP-1。 FPM 設定 pm.max_children = 5, Simulated.thread の項目は次のように記録されます。

Log thread 1508054181.4236 at 1508054182.4244(s)
Log thread 1508054181.4248 at 1508054182.4254(s)
Log thread 1508054181.426 at 1508054182.428(s)
Log thread 1508054181.6095 at 1508054182.6104(s)
Log thread 1508054182.4254 at 1508054183.4262(s)
Log thread 1508054183.4272 at 1508054183.4272(s)
Log thread 1508054182.4269 at 1508054183.4275(s)
Log thread 1508054182.4289 at 1508054183.43(s)
Log thread 1508054182.6085 at 1508054183.6091(s)
Log thread 1508054182.611 at 1508054183.6118(s)
ログイン後にコピー

最大同時接続処理能力のため、最後に生成された (シミュレートされた) スレッドの登録が赤いマークのエントリの位置に表示されます。プロセスプールは 5 なので、第 6 条の後にのみ表示されます。

Log thread 1508058075.042 at 1508058076.0428(s)
Log thread 1508058075.0432 at 1508058076.0439(s)
Log thread 1508058075.0443 at 1508058076.045(s)
Log thread 1508058075.6623 at 1508058076.6634(s)
Log thread 1508058076.0447 at 1508058077.0455(s)
Log thread 1508058076.046 at 1508058077.0466(s)
Log thread 1508058077.0465 at 1508058077.0466(s)
Log thread 1508058076.0469 at 1508058077.0474(s)
Log thread 1508058076.6647 at 1508058077.6659(s)
Log thread 1508058076.6664 at 1508058077.6671(s)
ログイン後にコピー

興味深いのは、緑色のエントリで表される (シミュレートされた) スレッドと赤色のエントリで表される (シミュレートされた) スレッドの登録時間が同じであり、2 つの (シミュレートされた) スレッドが同時に実行されていることを示しています。 。

2. PHP-FPM設定項目pm.max_children = 10、simulated.threadレコードは以下の通りです:

Log thread 1508061169.7956 at 1508061170.7963(s)
Log thread 1508061169.7966 at 1508061170.7976(s)
Log thread 1508061169.7978 at 1508061170.7988(s)
Log thread 1508061170.2896 at 1508061171.2901(s)
Log thread 1508061170.7972 at 1508061171.7978(s)
Log thread 1508061171.7984 at 1508061171.7985(s)
Log thread 1508061170.7982 at 1508061171.7986(s)
Log thread 1508061170.7994 at 1508061171.8(s)
Log thread 1508061171.2907 at 1508061172.2912(s)
Log thread 1508061171.2912 at 1508061172.2915(s)
ログイン後にコピー

サーバーの同時接続処理能力の上限が10に達したため、最新の生成された (シミュレートされた) スレッド 登録はどこにでも表示できます。

3. usleep(500) 遅延を実行すると、simulated.thread レコードは次のようになります:

Log thread 1508059270.3195 at 1508059270.3206(s)
Log thread 1508059270.3208 at 1508059270.3219(s)
Log thread 1508059270.322 at 1508059270.323(s)
Log thread 1508059270.323 at 1508059270.324(s)
Log thread 1508059270.3244 at 1508059270.3261(s)
Log thread 1508059270.3256 at 1508059270.3271(s)
Log thread 1508059270.3275 at 1508059270.3286(s)
Log thread 1508059270.3288 at 1508059270.3299(s)
Log thread 1508059270.3299 at 1508059270.331(s)
Log thread 1508059270.3313 at 1508059270.3314(s)
ログイン後にコピー

ログ レコードの順序が (シミュレートされた) スレッドの生成順序と一致していることがわかります。 。 usleep 遅延の基本単位はマイクロ秒 (us、1 s = 1000000 us) です。

上記のレコードからわかるように: 1) これらの (シミュレーション) スレッドは、スクリプトを実行するための最初のリクエストの後に自動的に生成されます。

2) これらの (シミュレートされた) スレッドの一部は同じサブプロセス空間で生成され、実行されます。

3) 隣接する (シミュレートされた) スレッドの生成間の時間間隔は非常に短く、ほぼ同時に、または次の (シミュレーション) スレッドは、前の (シミュレーション) スレッドが実行を終了して終了する前に生成されます。

4) 複数の (シミュレーション) スレッドを同時に実行できます。

ということで、マルチスレッド同時実行をシミュレートする上記の実装は成功しました。 PHP-FPM プロセス プール内の同じサブプロセスは、複数の接続リクエストを連続して処理できますが、同時に処理できる接続リクエストは 1 つだけです。未処理の接続リクエストはキューに入り、処理を待機します。つまり、同じ子プロセスには接続要求を同時に処理する機能がありません。

PHP-FPM プール構成: 複数のプールを定義でき、各プールは異なる構成項目を定義できます。以下は、探索中に私が注意を払ったその他の構成項目のリストです

1. listen: FastCGI リクエストを受け入れるアドレス。TCP ソケットと unix ソケットの 2 つの通信プロトコルをサポートします。 listen = [::]:9000 と設定できます。

2. listen.allowed_clients: 接続を許可される FastCGI クライアントのアドレス (IPv4/IPv6) のリスト。この構成項目は、listen.allowed_clients = 127.0.0.1,172.17.0.5 のようになります。

3. pm: プロセス マネージャーが子プロセスの数を制御する方法を選択します。この構成項目は、静的、動的、オンデマンドなど、FPM がプロセス プールを管理する方法を設定します。

4. pm.max_requests: 各子プロセスが再生成する前に実行するリクエストの数。これは、各子プロセスによって処理されるリクエストの数の上限を設定するのに役立ちます。サードパーティ ライブラリでの処理 メモリ リークに役立ちます。

5. pm.status_path: FPM ステータス ページを表示するための URI。

以上がphp-FPMプロセスプール探索の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles