ホームページ  >  記事  >  5 つの一般的な PHP 動作モードの詳細な説明

5 つの一般的な PHP 動作モードの詳細な説明

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼転載
2020-01-06 17:57:104331ブラウズ

5 つの一般的な PHP 動作モードの詳細な説明

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

1) CGI (Common Gateway Interface)

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

3) CLI (コマンドライン実行/コマンドラインインターフェース)

4) Webモジュールモード (ApacheなどのWebサーバー実行モード)

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

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

1.1. CGI モード

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

ユーザーリクエストがあるたびに、最初に CGI サブプロセスが作成され、次にリクエストが処理され、処理後にサブプロセスが終了します。これが Fork-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 が常にパフォーマンスが低く、リソース消費量が多いことで悪名が高い理由です。

1.2、FastCGI モード

FastCGI は CGI のアップグレードされたバージョンです。FastCGI は、実行中に常に実行できる長寿命 CGI のようなものです。これがアクティブ化されると、毎回フォークするのに時間がかかりません (これは 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 倍にすると、大量のメモリが消費されます。

1.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" と入力して実行モードを詳しく調べることができます。 。

1.4 モジュール モード

モジュール モードは mod_php5 モジュールの形式で統合されており、現時点では、mod_php5 モジュールの機能は PHP ファイル リクエストを受け取ることです。そして、これらのリクエストを処理し、処理結果を 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 の動作効率を向上させたものです)。

1.5 ISAPI モード

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

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

PHP 中国語 Web サイトには、無料の PHP 入門チュートリアル が多数あり、誰でも学習することができます。

この記事はhttps://www.jianshu.com/p/e9eef6dc7d67

から転載されています。
声明:
この記事はjianshu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。