ホームページ  >  記事  >  バックエンド開発  >  php-fpmはどのように機能しますか?

php-fpmはどのように機能しますか?

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼オリジナル
2019-08-28 16:23:585917ブラウズ

php-fpmはどのように機能しますか?

php-fpm はマスター (メイン)/ワーカー (子) のマルチプロセス アーキテクチャであり、nginx の設計スタイルに似ています。マスタープロセスは主にCGIやPHP環境の初期化、イベント監視、サブプロセスのステータスなどを担当し、ワーカープロセスはPHPリクエストの処理を担当します。

動作原理を紹介する前に、まずそのいくつかの動作モードを理解しましょう。

実行モード

php-fpm は、静的、オンデマンド、動的という 3 つの実行モードをサポートしています。デフォルトは動的です。

static: 静的モード。起動時に固定ワーカー プロセスが割り当てられます。

ondemand: オンデマンドで割り当て、ユーザーリクエストを受信したときにワーカープロセスをフォークします。

dynamic: 動的モード。起動時に固定プロセスが割り当てられます。リクエスト数が増加すると、ワーカープロセスは設定されたフローティング範囲内で調整されます。

これら 3 つのモードにはそれぞれ独自の利点があり、さまざまな環境に応じて対応する構成を調整できます。

この記事のテーマは、php-fpm の動作原理に焦点を当てたものです。

関連する推奨事項: 「PHP 入門チュートリアル

動作原理

php-fpm はマスター/ワーカーで設計されていますマスター プロセス モジュールとワーカー プロセス モジュールの機能については、上で簡単に説明しました。これら 2 つのモジュールの動作原理については、以下で詳しく説明します。

マスター プロセス

マスター プロセスのワークフローは、以下に示すように 4 つの段階に分かれています:

php-fpmはどのように機能しますか?

1 . cgi 初期化フェーズ: fcgi_init() 関数と sapi_startup() 関数をそれぞれ呼び出し、プロセス信号を登録し、sapi_globals グローバル変数を初期化します。

2. PHP 環境の初期化フェーズ: cgi_sapi_module.startup によってトリガーされます。実際には php_cgi_startup 関数が呼び出され、php_cgi_startup が内部で php_module_startup を呼び出して実行されます。

php_module_startup の主な機能:

a). php 設定のロードと解析;

b). php モジュールをロードし、関数シンボル テーブル (function_table) に記録します。

c). zend 拡張機能のロード;

d). 無効な関数とクラス ライブラリの設定を設定;

e). メモリ回復メソッドの登録;

3. php -fpm 初期化フェーズ: fpm_init() 関数を実行します。 php-fpm.conf ファイル構成の解析、プロセス関連パラメータ (プロセスが開くことができるファイルの最大数など) の取得、プロセス プールとイベント モデルの初期化、およびその他の操作を担当します。

4. php-fpm 実行フェーズ: fpm_run() 関数を実行すると、実行後にメイン プロセスがブロックされます。このフェーズは、フォーク子プロセスとループ イベントの 2 つの部分に分かれています。

フォークの子プロセス部分は、fpm_children_create_initial 関数によって処理されます (注: オンデマンド モードは fpm_pctl_on_socket_accept 関数で作成されます)。

ループ イベント部分は fpm_event_loop 関数を通じて処理されます。この関数は内部の無限ループであり、イベントの収集を担当します。

ワーカー プロセス

ワーカー プロセスは、クライアント リクエストの受信、リクエストの処理、リクエストの完了の 3 つの段階に分かれています。

php-fpmはどのように機能しますか?

#1. クライアント リクエストの受信: fcgi_accept_request 関数を実行します。この関数は、accept 関数を呼び出してクライアント リクエストを内部的に取得します。

//请求锁
FCGI_LOCK(req->listen_socket);
req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len);
//释放锁
FCGI_UNLOCK(req->listen_socket);

上記のコードを見ると、リクエストを受け入れる前にリクエストのロック操作があることがわかりますが、これはリクエストにおける「ショック」現象を回避するための設計です。もちろん、これはオプションであり、この機能を無効にすることもできます。

2. リクエストの処理フェーズ: まず、fpm_request_info と php_request_startup をそれぞれ呼び出してリクエストの内容を取得し、グローバル変数 ($_GET、$_POST、$_SERVER、$_ENV、$_FILES) を登録し、次に php_fopen_primary_script を呼び出してアクセスします。リクエスト情報に従ってスクリプト ファイルが作成され、最終的に php_execute_script に渡されて実行されます。 php_execute_script は内部で zend_execute_scripts メソッドを呼び出し、スクリプトを zend エンジンに渡して処理します。

3. リクエスト終了フェーズ: php_request_shutdown 関数を実行します。このとき、登録した関数や register_shutdown_function の __destruct() メソッドをコールバックし、応答内容の送信やメモリの解放などを行います。

概要

php-fpm はマスター/ワーカー アーキテクチャ設計を採用しており、マスター プロセスは CGI および PHP パブリック環境の初期化とイベント監視操作を担当します。ワーカー プロセスはリクエスト処理機能を担当します。ワーカー プロセスがリクエストを処理するときに、PHP 実行環境を再度初期化する必要がありません。これが、php-fpm の優れたパフォーマンスの理由の 1 つです。

以上がphp-fpmはどのように機能しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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