ホームページ  >  記事  >  バックエンド開発  >  PHP にはいくつかの実行モードがあります

PHP にはいくつかの実行モードがあります

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼オリジナル
2019-09-25 11:54:483073ブラウズ

PHP にはいくつかの実行モードがあります

PHP の 5 つの一般的な動作モードについて:

(1) CGI (Common Gateway Interface)

(2) ) FastCGI (常駐 CGI/ロングライブ CGI)

(3) CLI (Command Line Run/Command Line Interface)

(4) Web モジュール モード (

(5) ISAPI (インターネット サーバー アプリケーション プログラム インターフェイス)

注: PHP5.3 以降、PHP には ISAPI モードがなく、インストール後にも使用できなくなります。次に、php5isapi.dll ファイルがあります。 IIS6 で上位バージョンの PHP を使用するには、FastCGI 拡張機能をインストールし、IIS6 が FastCGI をサポートできるようにする必要があります。

1. CGI モード

CGI は Common Gateway Interface (Common Gateway Interface) のことで、プログラムであり、平たく言えば、CGI は接続する橋のようなものです。 Web ページを Web サーバーの実行プログラムに接続し、HTML で受け取った命令をサーバーの実行プログラムに渡し、サーバーの実行プログラムの結果を HTML ページに返します。 CGI は非常にクロスプラットフォームであり、ほぼすべてのオペレーティング システムに実装できます。 CGI はすでに古いモデルであり、近年ではほとんど使用されていません。

ユーザーリクエストがあるたびに、最初に CGI サブプロセスが作成され、次にリクエストが処理され、サブプロセスは処理後に終了します。 And-Execute モード。ユーザーリクエストの数が非常に多い場合、メモリやCPU時間などのシステムリソースが大量に占有され、パフォーマンスが低下します。したがって、CGI を使用するサーバーには、接続要求と同じ数の CGI サブプロセスが存在することになり、サブプロセスの繰り返しロードが CGI パフォーマンス低下の主な原因となります。

PHP をサーバー側ソフトウェア (Apache など) に埋め込んでモジュールとしてインストールしたくない場合は、CGI モードでインストールすることを選択できます。または、PHP とさまざまな CGI ラッパーを使用して、コード用に安全な chroot および setuid 環境を作成します。このようにして、各クライアントは PHP ファイルを要求し、Web サーバーは php.exe (Win では php.exe、Linux では php) を呼び出してファイルを解釈し、解釈結果を次の形式でクライアントに返します。ウェブページ。このインストール方法では、通常、PHP 実行可能ファイルが Web サーバーの cgi-bin ディレクトリにインストールされます。 CERT 勧告 CA-96.11 では、cgi-bin ディレクトリにインタプリタを配置しないことが推奨されています。この方式のメリットは、Webサーバーと特定のプログラム処理が分離されており、構造が明確で制御性が高いことですが、デメリットとしては、アクセスが集中するとCGIのプロセスフォークが巨大化することです。サーバーの負担。何百もの同時リクエストによりサーバーが何百ものプロセスをフォークすることを想像してみれば、理解できるでしょう。これが、CGI が常にパフォーマンスが低く、リソース消費量が多いことで悪名が高い理由です。

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

2. FastCGI モード

FastCGI は、次のアップグレードです。 CGI バージョンの FastCGI は長寿命 CGI のようなもので、常に実行でき、アクティブ化されている限り、毎回フォークするのに時間がかかりません (これは最も批判されているフォークして実行するモードです)。

FastCGI は、HTTP サーバーと動的スクリプト言語間の通信のためのスケーラブルな高速インターフェイスです。 Apache、Nginx、lighttpd などの最も一般的な HTTP サーバーは FastCGI をサポートしており、同時に FastCGI は PHP などの多くのスクリプト言語でもサポートされています。

FastCGI インターフェイス モードは C/S 構造を採用しており、HTTP サーバーとスクリプト解析サーバーを分離し、スクリプト解析サーバー上で 1 つ以上のスクリプト解析デーモンを起動できます。 HTTP サーバーが動的プログラムに遭遇するたびに、そのプログラムは実行のために FastCGI プロセスに直接配信され、その結果がブラウザーに返されます。この方法により、HTTP サーバーは静的リクエストを排他的に処理したり、動的スクリプト サーバーの結果をクライアントに返すことができるため、アプリケーション システム全体のパフォーマンスが大幅に向上します。

[原則]

(1) Web サーバーの起動時に FastCGI プロセス マネージャー (IIS ISAPI または Apache モジュール) をロードします;

(2 ) FastCGI プロセス マネージャーは自身を初期化し、複数の CGI インタープリター プロセス (複数の php-cgi.exe または php-cig が表示されます) を開始し、Web サーバーからの接続を待ちます;

(3) クライアントがリクエストしたときWeb サーバー、FastCGI プロセス マネージャーは CGI インタープリターを選択して接続します。 Web サーバーは、CGI 環境変数と標準入力を FastCGI サブプロセス php-cgi;

(4) FastCGI サブプロセスが処理を完了すると、標準出力とエラー情報をサーバーに返します。同じ接続からの Web サーバー。 FastCGI 子プロセスが接続を閉じると、リクエストが処理されます。次に、FastCGI 子プロセスは、FastCGI プロセス マネージャー (WebServer で実行されている) からの次の接続を待機して処理します。通常の CGI モードでは、php-cgi.exe はここで終了します。

CGI モードでは、CGI が通常どれほど遅いか想像できるでしょう。 PHP へのすべての Web リクエストでは、php.ini を再解析し、すべての DLL 拡張機能を再ロードし、すべてのデータ構造を再初期化する必要があります。 FastCGI では、これらすべてがプロセスの開始時に 1 回だけ行われます。さらに、永続的なデータベース接続が機能するという利点もあります。

注: PHP の FastCGI プロセス マネージャーは PHP-FPM (PHP-FastCGI Process Manager) です。

【メリット】

(1) 安定性の観点から見る, FastCGI は CGI を実行するために独立したプロセス プールを使用します。単一のプロセスが終了した場合、システムはそれを簡単に破棄し、ロジックを実行する新しいプロセスを再割り当てできます。

(2) セキュリティの観点から、FastCGI はサポートしています分散コンピューティング。 FastCGI はホスト サーバーから完全に独立しています。FastCGI がどのようにダウンしても、サーバーはダウンしません。

(3) パフォーマンスの観点から、FastCGI は動的ロジックの処理をサーバーから分離します。負荷の大きいIOを処理するため、ホストサーバーに任せた方がIOに集中できる 通常の動的Webページの場合、論理的な処理はほんの一部で、大量の処理が行われる可能性があります写真などの静的処理。

【デメリット】

メリットをお話しした後は、デメリットについてお話します。実際に使用したところ、FastCGI モードは実稼働環境のサーバーに適しています。ただし、開発マシンには適していません。 Zend Studio を使用してプログラムをデバッグすると、FastCGI は PHP プロセスがタイムアウトしたと判断し、ページ上で 500 エラーを返すためです。これは非常に面倒だったので、開発マシンで ISAPI モードに戻しました。一部のサーバーの新しいバージョンのサポートは良好ではないため、分散負荷分散を必要としないモジュール式インストールの方が良い選択です。 FastCGI とサーバー間の現在の通信は十分にスマートではありません。FastCGI プロセスの実行に時間がかかりすぎると、そのプロセスは強制終了され、デッド プロセスとして再起動されます。これは、長期的なタスクを処理する場合に非常に問題です。また、FastCGI が実行できなくなります。オンラインデバッグを可能にします。マルチプロセスであるため、CGI マルチスレッドよりも多くのサーバー メモリを消費します。PHP-CGI インタープリタはプロセスごとに 7 ~ 25 メガバイトのメモリを消費します。この数値を 50 または 100 倍にすると、大量のメモリが消費されます。

3. CLI モード

PHP-CLI は、PHP Command Line Interface の略称で、その名の通り、PHP を実行するためのインターフェースです。コマンドライン上で使用され、Web サーバー上で実行される PHP 環境 (PHP-CGI、ISAPI など) とは区別されます。つまり、PHP はフロントエンドの Web ページを作成できるだけでなく、バ​​ックエンド プログラムの作成にも使用できます。 PHP CLI シェル スクリプトは、PHP のすべての利点に適用され、スクリプトまたはサーバー側システム、または GUI アプリケーションの作成を可能にします。PHP-CLI モードは、Windows と Linux の両方でサポートされています。

【利点】

(1) 複数のプロセスを使用すると、子プロセスが終了した後、カーネルがリソースのリサイクルを担当します。 ## (2) 複数のプロセスを使用すると、子プロセスが異常終了してもプロセス全体のスレッドが終了することはなく、親プロセスにはプロセスを再構築する機会が与えられます;

(3) 常駐メインプロセスはタスクの分散のみを担当し、ロジックはより明確です。

Linux では、PHP がインストールした拡張機能 (PHP コマンド ラインの実行モード) を確認するために "php -m" をよく使用します。興味のある学生は、"php -h" と入力して実行モードを詳しく調べることができます。 。

4. モジュールモード

モジュールモードは mod_php5 モジュールの形で統合されており、このとき mod_php5 モジュールの機能は PHP ファイルリクエストを受け取ることです。これらのリクエストは Apache によって渡され、処理されます。これらのリクエストは処理され、結果が Apache に返されます。 Apache が起動する前に設定ファイルで PHP モジュール (mod_php5) を設定すると、PHP モジュールは apache2 の ap_hook_post_config フックを登録し、Apache が PHP ファイルに対するリクエストの受け入れを開始したときにこのモジュールを起動します。

この起動時の読み込み方法に加えて、Apache のモジュールは実行時に動的に読み込むことができます。つまり、ソース コードを再コンパイルする必要がなく、サーバーをまったく停止せずにサーバーを拡張できることになります。必要なのは、信号 HUP または AP_SIG_GRACEFUL をサーバーに送信して、モジュールをリロードするようにサーバーに通知することだけです。ただし、動的ロードの前に、モジュールをダイナミック リンク ライブラリにコンパイルする必要があります。このときのダイナミックロードとは、ダイナミックリンクライブラリをロードすることです。 Apache のダイナミック リンク ライブラリの処理は mod_so モジュールによって完了するため、mod_so モジュールは動的にロードできず、Apache のコアに静的にコンパイルすることしかできません。これは、Apache とともに起動されることを意味します。


Apache はどのようにモジュールをロードしますか?例として、前述の mod_php5 モジュールを見てみましょう。まず、Apache の設定ファイル httpd.conf に行を追加する必要があります:

LoadModule php5_module modules/mod_php5.so

ここでは LoadModule コマンドを使用します。コマンドの最初のパラメータはモジュールの名前です。名前はソースにあります。モジュール実装のコード。 2 番目のオプションは、モジュールが配置されているパスです。サーバーの実行中にモジュールをロードする必要がある場合は、シグナル HUP または AP_SIG_GRACEFUL をサーバーに送信できます。シグナルを受信すると、Apache はサーバーを再起動せずにモジュールを再ロードします。


この動作モードは、Windows 環境で Apache サーバーを使用するときによく使用されるモードであり、モジュール化 (DLL) では、PHP が起動され、Web サーバーと一緒に実行されます。 (Apache を CGI ベースに拡張し、PHP の動作効率を向上させたものです)。


5. ISAPI モード

ISAPI (Internet Server Application Program Interface) は、Microsoft が提供するインターネット サービス用の API インターフェイスのセットです。ISAPI DLL は、ユーザーの要求によってアクティブ化された後、メモリ内に常駐し、ユーザーからの別の要求を待機することができます。複数のユーザーリクエスト処理機能を一つのDLL内に実装しており、さらにISAPI DLLアプリケーションとWWWサーバーが同一プロセス内にあるため、CGIに比べて大幅に効率が高くなります。 (Microsoft の独占権のため、Windows 環境でのみ実行できます)

PHP は Apache モジュールであり、Apache サーバーがシステムを起動すると、複数のプロセスのコピーが事前に生成され、メモリ内に常駐します。リクエストが発生すると、これらのアイドル状態のサブプロセスがすぐに処理に使用されるため、サブプロセスの生成による遅延は発生しません。これらのサーバー コピーは、HTTP 要求の処理後すぐには終了せず、次の要求を待ってコンピューター内に留まります。クライアントのブラウザ要求に対する応答が速くなり、パフォーマンスが向上します。

以上がPHP にはいくつかの実行モードがありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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