ホームページ >バックエンド開発 >PHPチュートリアル >FastCGI 不完全上級ガイド (PHP 版、Windows プラットフォーム)_PHP チュートリアル
質問
FastCGI 不完全上級ガイド (PHP バージョン、Windows プラットフォーム)
解決策
1. FastCGIとは何ですか?
FastCGI は、言語に依存しないスケーラブルなアーキテクチャの CGI オープン拡張機能であり、その主な動作は CGI インタプリタ プロセスをメモリ内に保持することで、より高いパフォーマンスを実現します。ご存知のとおり、CGI インタープリタの繰り返しロードが CGI パフォーマンス低下の主な原因です。CGI インタープリタがメモリ内に残り、FastCGI プロセス マネージャーのスケジューリングを受け入れる場合、良好なパフォーマンス、スケーラビリティ、フェイルオーバー機能などが提供されます。
FastCGI の公式サイトは [url=http://www.fastcgi.com/] リンクには http://www.fastcgi.com[/url] とマークされています
FastCGI の動作原理は次のとおりです:
1. Web サーバーの起動時に FastCGI プロセス マネージャー (IIS ISAPI または Apache モジュール) をロードします。
2. FastCGI プロセス マネージャーは自身を初期化し、複数の CGI インタープリター プロセス (タスク マネージャーに表示される複数の php-cgi.exe) を開始し、Web サーバーからの接続を待ちます。
3. クライアント要求が Web サーバーに到達すると、FastCGI プロセス マネージャーが CGI インタープリターを選択して接続します。 Web サーバーは、CGI 環境変数と標準入力を FastCGI サブプロセス php-cgi.exe に送信します。
4. FastCGI サブプロセスは処理を完了すると、標準出力とエラー情報を同じ接続から Web サーバーに返します。 FastCGI 子プロセスが接続を閉じると、リクエストが処理されます。次に、FastCGI 子プロセスは、FastCGI プロセス マネージャー (WebServer で実行されている) からの次の接続を待機して処理します。 通常の CGI モードでは、php-cgi.exe はここで終了します。
上記のケースでは、CGI が通常どれほど遅いか想像できるでしょう。 PHP へのすべての Web リクエストでは、php.ini を再解析し、すべての DLL 拡張機能を再ロードし、すべてのデータ構造を再初期化する必要があります。 FastCGI では、これらすべてがプロセスの開始時に 1 回だけ行われます。さらに、永続的なデータベース接続が機能するという利点もあります。
2. マルチスレッド CGI インタープリタの代わりに FastCGI を使用するのはなぜですか?
これは、次のような多くの考慮事項が原因である可能性があります:
1. Windows プラットフォームではマルチスレッド CGI インタープリタを安定して使用することはできません。IIS ISAPI メソッドであっても、APACHE モジュール メソッドであっても、一定期間実行すると必ずクラッシュします。不思議ですか?しかし、そのような状況は実際に存在します!
もちろん、マルチスレッド CGI インタプリタを安定して使用できる場合も多くありますが、FastCGI に切り替えると、Web ページにエラーが発生し、その原因が見つからない場合があります。このようなエラーの削減は大幅に増加します。これがなぜなのかはわかりませんが、結局のところ、独立したアドレス空間を持つ CGI インタプリタのほうが、共有アドレス空間形式よりももう少し安定しているのではないかと思います。
2.パフォーマンス!パフォーマンス?可能ですか、FastCGI はマルチスレッド CGI インタプリタよりも高速ですか?しかし、それが真実である場合もあり、Web サイトをテストすることによってのみ最終的な結論を下すことができます。理由を説明するのは難しいですが、Zend WinEnabler の時代に、当初 Zend は Windows プラットフォームで IIS ISAPI や Apache Module の代わりに FastCGI を使用することを推奨していましたが、現在 Zend はこの製品を製造していません。
3. FastCGI を使用しない理由
1. マルチプロセスは、マルチスレッドよりも多くのサーバー メモリを消費します。php-cgi.exe インタープリタは、プロセスごとに 7 ~ 25 メガバイトのメモリを消費します。この数値を 50 または 100 倍にして試してください。
2. パフォーマンス。確かに、マルチスレッド CGI インタプリタの方が高速な場合もあります (笑)。また、非常に安定している場合もあります。
3. CGI?すごく素朴な感じですね、笑
4. IIS FastCGI設定方法
1. まず、PHP 4.3.x 以降のバージョンが正しくインストールされていることを確認します。 PHP の以前のバージョンには、デフォルトでは FastCGI サポートが含まれていませんでした。以前のバージョンで作業したい場合は、再コンパイルする必要があります。 PHP は c:php にインストールされており、FastFCGI をサポートする実行ファイル名は php-cgi.exe であると仮定します。
注: Php.ini で cgi.force_redirect をオフにし、fastcgi.impersonate を有効にし、cgi.rfc2616_header を有効にすることをお勧めします
2. [url=http://www.caraveo.com/fastcgi/fastcgi-0.6.zip] リンクタグ http://www.caraveo.com/fastcgi/fastcgi-0.6.zip[/url] をダウンロードして配置しますisapi_fcgi.dll を c:php ディレクトリに解凍します (このディレクトリにある必要はありません。ここでは便宜上説明しているだけです)。
3. regedit.exe を使用して、次のレジストリ キーを作成します。
HKEY_LOCAL_MACHINE:SoftwareFASTCGI.php (必須)
4. この項目の下に次のキー値を作成します:
文字列型: AppPath、値は c:phpphp-cgi.exe (必須)
文字列型: BindPath、値は php-fcgi (必須)
以下はオプションの構成キーの値です:
DWORD タイプ: StartServers、起動時にデフォルトで開始されるインタープリターの数、デフォルト値は 5 です
DWORD タイプ: MaxServers、インタープリターの最大数、デフォルトは 25
DWORD型: IncrementServers、インタプリタが足りない場合のインクリメント数、デフォルトは2
DWORD タイプ: タイムアウト、増分インタープリター (StartServer の数を超える) 生存時間、デフォルト 600 (秒)
DWORD タイプ: ThreadPoolSize、スレッド プール サイズ、IIS でのみ有効、デフォルトは 10
DWORD タイプ: 偽装。1 の場合は IIS セキュリティ フラグを使用し、0 の場合はこの機能をオフにします。セキュリティ上の問題を心配しない場合は、オフにしないでください。デフォルト 1
DWORD タイプ: MaxPostData、投稿データの先読みバイト制限、デフォルトは 0
DWORD タイプ: BypassAuth、IIS でのみ有効で、isapi_fcgi.dll が IIS フィルターとして構成され、IIS が BASIC 認証を使用するように構成されている場合、すべての認証要求に IIS 匿名ユーザーの使用が強制されます。このオプションの目的は、スクリプトが独自のセキュリティ メカニズムを実装できるようにすることです。デフォルト 0
BINARY 型: CustomVars、追加の環境変数値、改行で区切られ、Null で終了
5. IIS6 の場合は、c:phpisapi_fcgi.dll を指す Web サービス拡張機能を追加して許可します。アプリケーションプールの「ワーカープロセスの最大数」は1のままにしてください。
6. アプリケーション拡張子のマッピング関係を追加します:
1) インターネット インフォメーション サービス マネージャーで、Web サイトまたはアプリケーションのルート ディレクトリを選択します。
2) ディレクトリのプロパティ ページを開き (右クリックして [プロパティ] を選択)、[ホーム ディレクトリ] を選択します。
3) 「設定」ボタンをクリックし、「マッピング」タブページを選択します。
4) [追加...] をクリックし、[実行可能ファイル] を c:phpisapi_fcgi.dll に設定し、拡張子を .php に設定します。必ず [ファイルが存在するかどうかを確認する] を選択して、[OK] を選択します。設定を保存します。
5) .php3 または .phtml 拡張子のサポートも追加します (オプション)。
6) 設定を保存し、IIS を再起動します。
7. 複数の Web ページを同時に要求してテストし、ページが完了した後も php-cgi.exe プロセスが実行され続け、終了しません。
5. Apacheの設定方法
1. まず、PHP 4.3.x 以降のバージョンが正しくインストールされていることを確認します。 PHP の以前のバージョンには、デフォルトでは FastCGI サポートが含まれていませんでした。以前のバージョンで作業したい場合は、再コンパイルする必要があります。 PHP は c:php にインストールされており、FastFCGI をサポートする実行ファイル名は php-cgi.exe であると仮定します。
注: Php.ini では、cgi.force_redirect をオンにし、fastcgi.impersonate をオフにし、cgi.rfc2616_headers をオフにすることをお勧めします。
2. [url=http://www.fastcgi.com/dist/mod_fastcgi-2.4.2-AP20.dll] リンク タグ http://www.fastcgi.com/dist/mod_fastcgi-2.4.2-AP20 をダウンロードします。 dll[/url] を作成し、Apache 2.x の Modules ディレクトリに置きます。
3. Apache 2.x が CGI モードで PHP を正常に実行できることを確認します。 httpd.conf には次の行が存在します:
ScriptAlias /php/ "c:/php/"
アクション application/x-httpd-php "/php/php-cgi.exe"
SetEnv PHPRC "C:/php"
AddType application/x-httpd-php .php
4. httpd.conf に
を追加します。
LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP20.dll
# 注: ここでの -processes 3 は、3 つの php-cgi.exe プロセスを開始することを意味します。
# FastCgiServer の詳細なパラメータについては、FastCGI のドキュメントを参照してください。
FastCgiServer "c:/php/php-cgi.exe" -processes 3
5. Apache を再起動し、上記のようにテストします。
6. 高度な構成
Apache 2 と IIS 6 がサーバー上で同時に実行されており、両方の Web サーバーが PHP アプリケーションを実行しているシナリオを想像してください。その場合、3 つの可能性があります:
A. PHP は、iis isapi および Apache モジュールを使用してインストールされます。どちらもマルチスレッド モードで実行されます。これは FastCGI とは関係ありません。
B. サーバーの 1 つは FastCGI を使用し、もう 1 つはマルチスレッドを使用します。これはうまくいきます。
C. どちらも FastCGI を使用しますが、これはしばしば異常です。一般的なパフォーマンスは次のとおりです:
2 つのサーバーはそれぞれいくつかの php-cgi.exe プロセスを開始しますが、一方のサーバーは php ページを解釈しないか、しばらくすると新しい php-cgi.exe プロセスを生成します (恐ろしいことです)。
なぜ?おそらく、上で使用した 2 つのもの (iis isapi と apache モジュール) の作成者は、これらを同時に使用することを考えていなかったからだと思います (笑)。よく考えてみると、Apache 2 と IIS 6 が php-cgi.exe インタープリターのバッチを共有できれば素晴らしいのですが、これによりメモリを無駄にせず、おそらくスケジュールの問題も発生しないでしょう。
研究とテストにより、このアイデアが実現可能であることが証明されました。ただし、Shane Caraveo は ISAPI DLL で外部 FastCGI サービスを使用する機能を提供していないため、このシナリオでは IIS は php-cgi.exe の起動と管理、およびこれらの IIS 管理サービスを使用するように Apache を構成することのみを担当できます。 php-cgi.exe プロセス。
設定方法:
1. 上記の 4 つの方法に従って IIS FastCGI を構成します。
2. 基本的に上記 5.4.5.4 の方法に従って Apache FastCGI を設定します。代わりに httpd.conf に
を追加します。
LoadModule fastcgi_module modules/mod_fastcgi-2.4.2-AP20.dll
# 外部 FastCGI サーバーを使用するには、FastCGI のドキュメントを参照してください。
FastCgiExternalServer "c:/php/php-cgi.exe" -socket "php-fcgi"
注: -socket パラメーターの後の値は、2 つの FastCGI プロセス マネージャーが同じ名前付きパイプを使用して php-cgi.exe に接続するように、HKEY_LOCAL_MACHINE:SoftwareFASTCGI.php の BindPath の値と一致している必要があります。
注: この構成では、php-cgi.exe プロセスは、IIS の FastCGI プロセス マネージャーによってのみ管理されます。Apache のビジー リクエストによって、IIS の FastCGI がさらに php-cgi.exe プロセスをスケジュールすることはありません。したがって、IIS で FastCGI を構成する場合は、PHP インタープリターの数が不足しないように、StartServers の値を十分に大きくする必要があります。同じ問題は、IIS が閉じている場合、Apache が Php インタープリターを見つけることができないことです。これには注意してください。
ここから生じる疑問の 1 つは、「この時点で cgi.force_redirect、fastcgi.impersonate、および cgi.rfc2616_headers を php.ini でどのように設定する必要があるか」ということです。これは皆さんに考えてもらいます…笑
発生する可能性のあるもう 1 つの問題は、IIS が非常にアイドル状態になることです。しばらくすると、IIS によって起動された php-cgi.exe が終了し、Apache が Php を解釈できなくなります。この時点で、iis の Web サイトにアクセスすると、php-cgi.exe が再び起動します。 1 つの提案は、IIS 6 のプロセス プール管理を使用し、アプリケーション プールの「アイドル タイムアウト」をオフにし、「アプリケーション プール ID」の実行アカウントを Apache サービスの起動アカウントと一致するように設定することです。
ネチズンの提案:
コレクション...
ネチズンの提案:
お気に入り
ただし、FastCGI を使用すると、複数のマシンで同じようにクラッシュすることがよくあります。理由はわかりません。
ネチズンの提案:
公式ダウンロードアドレス: [url=http://www.fastcgi.com/dist/]リンクタグ http://www.fastcgi.com/dist/[/url]
バージョンは 2.4.6 にアップグレードされました。投稿者が提供したダウンロード アドレスは機能しません。この記事は比較的古いはずです。
[url=http://www.111cn.cn/html/30/n-34030.html]リンクタグ http://www.111cn.cn/html/30/n-34030.html[/url] この記事見てください
Windows で PHP を Apache 2.0.x で動作させるには 2 つの方法があります。 1 つは CGI 実行可能プログラムを使用し、もう 1 つは Apache モジュール用の DLL を使用します。
したがって、ある観点から見ると、Apache モジュール モードでインストールされた PHP4 は、CGI モードよりもセキュリティが高く、実行効率と速度が優れています。
質問: Apache モジュール モードでインストールされた PHP は fastcgi を使用できますか。つまり、どちらも Apache モジュール モードでロードされ、インストール後に通常どおり実行されますが、この 2 つの違いは何ですか?
FastCGI の Apache モジュールには、プロセスが壊れたり、ハングアップしても強制終了できないなど、いくつかの問題があり、非常に不安定になります。幸いなことに、FCGID のような解決策があり、FCGI を終了させることはありません。
http://fastcgi.coremail.cn/index.cn.htm
[ ]
ネチズンの提案:
使ったことない
ネチズンの提案:
マーク
ネチズンの提案:
それを取り去ってください、[img]http://www.111cn.cn/bbs/images/smilies/default/lol.gif[/img]
ネチズンの提案:
いいですね!
ネチズンの提案:
いいですね……つまり、FCGI よりも APACHE MODEL の方が優れています。 。 。 。 。 。 。 。 。 。 [img]http://www.111cn.cn/bbs/images/smilies/default/33.gif[/img] [img]http://www.111cn.cn/bbs/images/smilies/default/33 .gif[/img][img]http://www.111cn.cn/bbs/images/smilies/default/33.gif[/img]
ネチズンの提案:
建物の中で勉強
http://www.bkjia.com/PHPjc/632516.html
。