PHPには5つの動作モードがあり、そのうち4つは一般的です。
- CGI(Common Gateway Interface)
- FastCGI(常駐CGI / Long-Live CGI)
- CLI(コマンドラインインターフェース)
- LoadModule【Apache限定】
- ISAPI(インターネットサーバーアプリケーションプログラムインターフェイス)[IIS固有]
注:PHP5.3以降、PHPにはISAPIモードがなくなり、インストール後にphp5isapi.dllファイルはなくなりました。IIS6で上位バージョンのPHPを使用するには、FastCGI拡張機能をインストールしてから、IIS6がFastCGIをサポートできるようにする必要があります。
現在の動作モードを表示します
echo php_sapi_name();
CGIモード
前書き:
CGIはCommon Gateway Interface(Common Gateway Interface)の略で、プログラムです。つまり、CGIはWebページとWebサーバーの実行プログラムを接続するブリッジのようなものです。HTMLが受け取った指示をサーバーの実行プログラムに渡します。 、そしてサーバー実行プログラムの結果をHTMLページに返します。CGIは優れたクロスプラットフォームパフォーマンスを備えており、ほとんどすべてのオペレーティングシステムに実装できます。
呼び出しプロセス:Fork-And-Executeモード
ユーザーの要求—> Webサーバーが要求を受信[一般的に使用されるNginx、Apache] —> CGI子プロセスのフォークと要求の処理---->要求が処理された後、結果をWebサーバーに返し、子プロセスを破棄—> Webサーバーが結果をユーザーに返す
イラスト:
利点:
PHPの最も初期の動作モードとして、各リクエストは独立して処理され、呼び出しプロセスはシンプルで十分明確であり、制御性は強力です。
データが汚染されないように、プロセスは分離されています。
短所:
各リクエストは新しいCGIサブプロセスをフォークする必要があります。1,000の同時リクエストが同時にリクエストされた場合、1,000のサブプロセスがフォークされることになります。これにより、いくつかの問題が発生します。
- 子プロセスのフォークには時間とメモリが必要[コピーオンライト]
- 子プロセスが多すぎると、CPUはコンテキストの切り替えに多くの時間を費やします。
- リクエストごとに関連リソースをリロードします
FastCGIモード
前書き:
FastCGIは、CGIのアップグレードバージョンです。FastCGIは、長期間有効なCGIのようなものです。Webサーバーを起動すると、FastCGIプロセスマネージャ[PHP-FPM、IIS ISAPI、Apacheモジュール]がロードされ、リクエストが送信されるとその時点では、WebサーバーはFastCGIプロセスマネージャーによってのみ処理される必要があります。
呼び出しプロセス:PHP-FPMを例に取る
Webサーバーが起動すると、PHP-FPMマスタープロセス(主にアイドル状態の自己子プロセスへの要求の割り当てを担当)と特定の数のfast-cgi子プロセス(要求の処理を担当)を開始します。PHP-FPMマスタープロセスはプロセスプールを管理します。プールにはいくつかのfast-cgi子プロセスがあり、各fast-cgi子プロセスは互いに干渉することなく個別にリクエストを処理します。
ユーザーリクエスト—>ウェブサーバーがリクエストを受信[一般的に使用されるNginx、Apache] —> PHPリクエストが検出され、FPMマスタープロセスに転送—> FPMマスタープロセスがリクエストを処理するアイドルfast-cgi子プロセスを指定—>子プロセスがファイルをロードするphp.ini)およびその他のリソース処理要求—>処理が終了してリソースをクリアすると、結果がマスターに返され、子プロセスがハングし、アイドルとしてマークされます—>マスターが結果をWebサーバーに返します—> Webサーバーが結果をユーザーに返します
イラスト:
利点:
- 安定性の観点から、FastCGIはCGIを別のプロセスプールで実行します。単一のプロセスが停止すると、システムはそれを簡単に破棄し、新しいプロセスを再割り当てしてロジックを実行します。
- セキュリティの観点から、FastCGIとホストWebサーバーは完全に独立しており、FastCGIはWebサーバーの動作に影響を与えません[PHP-FPMが閉じている場合、502の不正なゲートウェイがユーザーに返されます]
- パフォーマンスの観点から、FastCGIは動的ロジックの処理をWebサーバーから分離し、高負荷のIO処理はホストサーバーに任されているため、ホストサーバーはIOに集中できます[通常の動的Webページの場合、ロジック処理は小さな部分、より多くは写真などの静的リソースの読み込みです]
短所:
fast-cgi子プロセスは一度に1つの要求しか処理できないため、Webサイトの同時パフォーマンスは子プロセスの数によって制限されます。
開いているプロセスが多すぎると、CPUがプロセスコンテキストの切り替えに多くの時間を費やす原因になります。
fast-cgi子プロセスが要求されるたびに、関連するリソースをリロードする必要があり、リソースは要求が終了したときに解放する必要があります
CLI(コマンドラインインターフェース)
前書き:
php-cliモードはコマンドラインモードに属します。phpの学習を始めてwampを開始したばかりの多くの開発者にとって、wnmpは最もなじみのない操作モードです。
このモードは他のプログラムに依存する必要はなく、php xx.phpを直接入力して実行しますPHPコードの
コマンドラインモードは、通常のWebモードとは明らかに異なります
。タイムアウト期間はありません。
バッファバッファはデフォルトでオフになっています
。STDINおよびSTDOUTの標準入出力は
、echo var_dumpを使用します。phpinfoなどの出力は、コンソールに直接出力されます。
利用可能なクラス/関数異なる
php.ini設定
PS:詳細は公式ドキュメントを参照してください:https : //www.php.net/manual/zh/features.commandline.php
LoadModule(Apache専用)
はじめに:
モジュールモードはmod_php5モジュールの形式で統合されています。現時点では、mod_php5モジュールの機能は、Apacheから渡されたPHPファイルリクエストを受信し、これらのリクエストを処理して、処理された結果をApacheに返すことです。
Apache構成ファイルhttpd.confでは、通常追加されるLoadModule php7_module "D:/.../ php71 / php7apache2_4.dll"がこの役割を果たします
呼び出しプロセス:
ユーザー要求—> Apacheサーバー—> mod_php5モジュールを呼び出して要求を処理—>要求結果をApacheに返す—> Apacheが結果をユーザーに返す
図:
ISAPI(インターネットサーバーアプリケーションプログラムインターフェイス)
前書き:
PHP5.3以降、PHPにはISAPIモードがなくなり、インストール後にphp5isapi.dllファイルはなくなりました。IIS6で上位バージョンのPHPを使用するには、FastCGI拡張機能をインストールしてから、IIS6がFastCGIをサポートできるようにする必要があります。ここではあまり紹介しません
図:
最後に書かれた:
今日のインターネットの爆発的な開発では、ほとんどのWebサイトがWebサイトの高い同時パフォーマンスを考慮する必要があります。Nginxは、その軽量さと優れた同時パフォーマンスにより、開発者にますます支持されています。ネットワーク全体でかつて人気のあったLAMPの組み合わせは、PHP開発者にとって最初の選択肢ではなくなりました。新しく登場したLNMPの組み合わせは、PHPerの必須コースになり、ApacheベースのLoadModuleモードについての言及が少なくなりました。
さらに、コマンドラインスクリプトの記述に使用されるCLIモードとほとんど消滅したISAPIモードは、Webサイトの構築には明らかに適していません。
CGIの拡張バージョンとして、Fast-CGIモードはPHP-FPMを使用して、CGIのシンプルさと安全性の継承に基づいて子プロセスを管理し、WebサーバーをI / Oの処理に集中させます。PHP-FPMは、高度なプロセスプールを管理および維持しますリクエストを処理するために待機している特定の数の子プロセスをフォークします。リクエストが来たときに子プロセスをフォークせず、リクエストの最後で子プロセスを破棄する必要もありません。