PHP 実行モードの深い理解_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:09:42
オリジナル
956 人が閲覧しました

PHP には 4 つの動作モードがあります:
1) CGI Common Gateway Interface)
2) fast-cgi Long-live CGI
3) cli コマンドライン操作 (Command) Line Interface)
4) Web モジュールモード (モジュール) apacheなどのWebサーバーで動作するモード)
1.CGI(Common Gateway Interface)
CGIとはCommon Gateway Interface(共通ゲートウェイインターフェース)のことで、平たく言えばブリッジのようなものです。 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 が常にパフォーマンスが低く、リソース消費量が多いことで悪名が高い理由です。

CGIモードのインストール:
CGIはすでに古いモードであり、近年ではほとんど使用されていないため、テストのみを目的としています。
CGI モードをインストールするには、
LoadModule php5_module modules/libphp5.so の行をコメントアウトする必要があります。この行をコメントしない場合は、ハンドラー モードまで進みます。それがモジュールモードです。
次に httpd.conf にアクションを追加します。
Action application/x-httpd-php /cgi-bin/
/cgi-bin/ ディレクトリで php-cgi が見つからない場合は、php の bin から 1 つを cp できます。
次に、Apache を再起動し、テスト ページを開くと、サーバー API が CGI/FastCGI に変更されることを確認します。説明: CGI モードに正常に切り替えられました。
問題:
1) /usr/local/httpd/cgi-bin/ で CGI プログラムを実行できず、403 または 500 エラーが発生した場合
Apache エラー ログを開くと、次のプロンプトが表示されます。許可が拒否されました: exec of
Linux コンテキスト ファイルの定義に従って、/usr/local/httpd/cgi-bin/ が httpd_sys_script_exec_t 属性である必要があります。 ls -Z で確認してください。そうでない場合は、次のコマンドで変更します。 chcon -t httpd_sys_script_exec_t /var/www/cgi-bin/*.cgi 仮想ホスト内の cgi の場合は、質問 2 を参照して使用できるようにしてください。その後、chcon を通じて CGI ファイルのコンテキストを
httpd_sys_script_exec_t に設定します。 chcon -R -t httpd_sys_script_exec_t cgi-bin/
2) Apache エラー メッセージ: .... スクリプトからの不正なヘッダー =
プロンプトによると、ファイルの最初の文を確認してください。出力は次のようになります。
Content-type: text/plain; charset=iso-8859-1nn
または Content-type: text/htmlnn
注: Content-type を宣言した後に 2 つの空白行が出力される必要があります。
3) Apache エラー メッセージ: 実行形式エラー
スクリプト インタプリタ設定エラー。スクリプトの最初の行は「#!Interpreter Path」の形式にする必要があります。PERL プログラムの場合、一般的なパスは #!/usr/bin/perl または # です。 !/usr/local/bin /perl PHP プログラムの場合、インタープリターのパスを入力する必要はなく、システムが自動的に PHP を見つけます。
2. Fastcgi モード
fast-cgi は、長寿命 CGI のようなもので、有効化されている限り常に実行されるわけではありません。一度フォークするのに時間がかかります (これは CGI の最も批判されているフォーク実行モードです)。
FastCGI の動作原理は次のとおりです:
(1) Web サーバーが起動すると、FastCGI プロセス マネージャーがロードされます [PHP の FastCGI プロセス マネージャーは PHP-FPM (php-FastCGI プロセス マネージャー)] (IIS ISAPI または Apache モジュール)。
(2) FastCGI プロセス マネージャーは自身を初期化し、複数の CGI インタープリター プロセス (タスク マネージャーに表示される複数の php-cgi.exe) を開始し、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 回だけ行われます。さらに、永続的なデータベース接続が機能するという利点もあります。
Fastcgi の利点:
1) 安定性の観点から、fastcgi は、単一のプロセスが停止した場合に、それを簡単に破棄し、実行する新しいプロセスを再割り当てできます
2。 ) セキュリティの観点から、Fastcgi はホスト サーバーから完全に独立しています。
3) パフォーマンスの観点からは、Fastcgi は動的ロジックを処理します。サーバーでは、負荷の高い IO 処理は引き続きホスト サーバーに任せられるため、ホスト サーバーは通常の動的 Web ページの場合、論理処理の一部のみが存在し、静的処理が多数存在します。 FastCGI の欠点 : 利点を説明した後、欠点について説明します。実際に使用したところ、FastCGI モードは実稼働環境のサーバーに適しています。ただし、開発マシンには適していません。 Zend Studio を使用してプログラムをデバッグすると、FastCGI は PHP プロセスがタイムアウトしたと判断し、ページ上で 500 エラーを返すためです。これは非常に面倒だったので、開発マシンで ISAPI モードに戻しました。

fastcgiモードをインストールします:
Apacheのインストールパスは/usr/local/httpd/です
phpのインストールパスは/usr/local/php/

1) mod_fastcgiをインストールします
wget http:// www.fastcgi.com/dist/mod_fastcgi-2.4.6.tar.gz
tar zxvf mod_fastcgi-2.4.6.tar.gz
cd mod_fastcgi-2.4.6
cp Makefile.AP2 Makefile
vi Makefile、編集 top_dir = / usr/local/ httpd
make
make install
インストール後、
/usr/local/httpd/modules/ にはもう 1 つのファイルが追加されます: mod_fcgid.so

2) php
./configure --prefix=/usr を再コンパイルします/local/ php --enable-fastcgi --enable-force-cgi-redirect --disable-cli
make
make install
この方法でコンパイルすると、PHP bin ディレクトリ内の php-cgi が fastcgi モードの php インタープリターになります。
インストール 成功したら、
php -v を実行して
PHP 5.3.2 (cgi-fcgi) を出力します
ここでの出力には cgi-fcgi が含まれます

注:
1 を追加することはできません。 apxs=/usr/ local/httpd/bin/apxs それ以外の場合、インストールされた php 実行ファイルは cli モードになります
2 コンパイル時に --disable-cli を追加しない場合は、PHP 5.3.2 (cli)

3) 設定apache
apache を設定する必要があります fastcgi モードで php プログラムを実行します
vi httpd.conf
仮想マシンを使用して実装します:

コードをコピーします コードは次のとおりです:

#Load fastcgi module
LoadModule fastcgi_module modules/mod_fastcgi.so
# //fastcgiを静的モードで実行し、10プロセスを開始
FastCgiServer /usr/local/php/bin/php-cgi -processes 10 -idle-timeout 150 -pass-header HTTP_AUTHORIZATION

#
DocumentRoot /usr/local/httpd/fcgi-bin
ServerName www.fastcgitest.com

ScriptAlias /fcgi-bin/ /usr/local/php/bin/ #Defineディレクトリ マッピング /usr/local/php の代わりに /fcgi-bin/ /bin/
Options +ExecCGI
AddHandler fastcgi-script .php .fcgi #.php で終わるリクエストは php-fastcgi で処理する必要があります
AddType application/x- httpd-php .php #MIMEタイプを追加
アクション application/x -httpd-php /fcgi-bin/php-cgi #php-fastcgiのプロセッサを設定します: /usr/local/php/bin/php-cgi
<ディレクトリ /usr/local/httpd/fcgi-bin/>
オプション インデックス ExecCGI
順序許可、拒否
すべてから許可



or

コードをコピー コードは次のとおりです:

ScriptAlias /fcgi-bin/ "/usr/local/php/bin" #ディレクトリ マッピング FastCgiServer を定義 /usr/local/php/bin/php-cgi -processes 10 #fastcgi サーバーを構成します。 < ディレクトリ "/usr/local/httpd/fcgi-bin/">SetHandler fastcgi-scriptOptions FollowSymLinksOrderallow,denyAllow from allAddType application/x-httpd-php .php #MIME タイプを追加 AddHandler php-fastcgi .php #.php で終わるリクエストは php-fastcgi アクションで処理する必要があります php-fastcgi /fcgi-bin/php-cgi #php-fastcgi のプロセッサを設定します


4).restart download apache , phpinfoを確認して、サーバー情報が
Apache/2.2.11 (Unix) mod_fastcgi/2.4.6などになっていればインストールは成功です。
403 エラーが発生した場合は、/usr/local/httpd/fcgi-bin/ に十分な権限があるかどうかを確認してください。コードのコピー

コードは次のとおりです:
&lt; directory /&gt;変更対象:
コードをコピーします

コードは次のとおりです:



Options FollowSymLinks
AllowOverride None
Order許可、拒否
Allow from all
以上です。 ps -ef|grep php-cgi は、10 個の fastcgi プロセスが実行中であることを確認できます。
3. CLI モード


cli は php のコマンドライン実行モードです。よく使用しますが、気づかないかもしれません (例: Linux では、PHP インストールを見つけるために "php -m" をよく使用します)。拡張子は PHP コマンド ラインの実行モードです。興味のある学生は php -h と入力して実行モードを詳しく学習できます)

1. PHP で指定されたファイルを実行します。

php script.php
php -f script.php
上記のどちらの方法でも (-f パラメーターの有無にかかわらず) スクリプトの script.php を実行できます。実行するファイルを選択できます。指定する PHP スクリプトには .php 拡張子が必要ではなく、任意のファイル名と拡張子を付けることができます。

2. コマンドラインで PHP コードを直接実行します。 php -r "print_r(get_define_constants());"
このメソッドを使用する場合は、シェル変数の置換と引用符の使用に注意してください。
注: 上記の例をよく読んでください。コードの実行時には開始マーカーと終了マーカーはありません。 -r パラメーターを使用すると、これらのマーカーは不要になり、構文エラーが発生します。

3. 標準入力 (stdin) を通じて実行する必要がある PHP コードを提供します。
上記の使用法により、次の例に示すように、PHP コードを動的に生成し、コマンド ラインからこれらのコードを実行できるようになります。


4. モジュールモード

モジュールモードは、mod_php5 モジュールの形式で統合されています。このとき、mod_php5 モジュールの機能は、Apache から渡された PHP ファイルリクエストを受け取り、それらのリクエストを処理し、処理された結果を返すことです。アパッチに。 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 に次の行を追加する必要があります。
この動作モードは、Windows 環境で Apache サーバーを使用するときによく使用されるモードであり、モジュール化 (DLL) では、PHP が Web サーバーと一緒に起動され、進捗。 (PHPの動作効率を上げるためにCGIをベースにApacheを拡張したものです)

コードをコピー
コードは以下の通りです:
LoadModule php5_module modules/mod_php5.so


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

5.php Nginx での実行モード (Nginx+ PHP-FPM)
FastCGI メソッドを使用すると、2 つの一般的なスタックがあります: lighthttpd+spawn-fcgi; もう 1 つは nginx+PHP-FPM です。 spawn-fcgi)。
A. 前述したように、どちらの構造も FastCGI を使用して PHP をサポートしているため、HTTPServer は完全に解放され、より適切に応答し、同時に処理できます。したがって、lighttpd と nginx は両方とも、小さいながらも強力で効率的であるという評判を得ています。
B. この 2 つは良いものと悪いものに分けられます。spawn-fcgi は lighttpd の一部であるため、lighttpd がインストールされている場合は、一般に spawn-fcgi が PHP をサポートするために使用されます。 lighttpd は使用されません。同時アクセスが多いと、前述のメモリ リークが発生し、fastcgi も自動的に再起動されます。つまり、この時点でユーザーがアクセスすると、PHP スクリプト プロセッサがクラッシュし、白いページが表示される可能性があります (つまり、PHP を解析できないか、エラーが発生します)。

もう 1 つ: まず、nginx には lighttpd 自体のような fastcgi (spawn-fcgi) が含まれていないため、完全に軽量であり、PHP を解析するためにサードパーティの FastCGI プロセッサの助けが必要です。つまり、実際には次のようになります。この nginx は非常に柔軟で、サードパーティの解析プロセッサに接続して PHP 解析を実現できます (nginx.conf での設定は簡単です)。 nginx は spwan-fcgi を使用できます (lighttpd を一緒にインストールする必要がありますが、nginx ではポートを回避する必要があります。一部の古いブログにはこれに関するインストール チュートリアルが記載されています)。ただし、spawn-fcgi には前述したようにユーザーによって徐々に発見される欠陥があるためです。上記のように、nginx+spawn-fcgi の組み合わせの使用を徐々に減らします。

C. spawn-fcgi の欠陥により、新しいサードパーティ (現在も、近い将来 PHP コアに追加することに熱心に取り組んでいると聞きました) が登場しました。これは、PHP と呼ばれます。 FPM (詳細については Google で確認できます)。 spawn-fcgi と比較すると、次の利点があります:
PHP パッチとして開発されているため、インストール時に PHP ソース コードと一緒にコンパイルする必要があります。つまり、PHP コアにコンパイルされるため、パフォーマンスの点で優れていることもあります。
同時に、高い同時実行性の処理においても spawn-fcgi よりも優れており、少なくとも fastcgi プロセッサを自動的に再起動しません。使用されている具体的なアルゴリズムと設計については、Google でご覧ください。

そのため、上で述べたように、nginx は軽量で柔軟性があるため、現在、nginx+PHP/PHP-FPM の組み合わせを使用する人が徐々に増えています
現在 6.基本的に、HTTPServer には 3 つの人気のあるスタックがあることがわかります:
(1) Apache+mod_php5
(2) lighttp+spawn-fcgi
(3) nginx+PHP-FPM
後の 2 つのパフォーマンスこの 3 つは若干優れているかもしれませんが、豊富なモジュールと機能により、Apache が依然としてリーダーです。 nginx+PHP-FPM は、同時実行性が高い条件下では Apache+mod_php5 の 5 ~ 10 倍に達する可能性があることをテストした人もいます。現在、nginx+PHP-FPM を使用する人が増えています。



http://www.bkjia.com/PHPjc/327261.html

www.bkjia.com

http://www.bkjia.com/PHPjc/327261.html技術記事 PHP には 4 つの動作モードがあります: 1) CGI コモン ゲートウェイ インターフェイス) 2) fast-cgi ロングライブ CGI 3) cli コマンド ライン操作 (コマンド ライン インターフェイス)...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート