PHP 実行モードの概要

高洛峰
高洛峰オリジナル
2016-12-26 13:34:121723ブラウズ

PHP には 4 つの動作モードがあります:

1) CGI 共通ゲートウェイ インターフェイス)
2) fast-CGI 常駐 (ロングライブ) CGI
3) cli コマンド ライン操作 (コマンド ライン インターフェイス) )
4) Web モジュール モード (モジュール モード (Apache などの Web サーバーを実行)
5) ISAPI (インターネット サーバー アプリケーション プログラム インターフェイス)

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

1. CGI (Common Gateway Interface)

CGI は、Web ページと WEB サーバー内の実行プログラムを接続するプログラムです。サーバーの実行プログラムに送信し、サーバーの実行プログラムの結果を 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 にアクションを追加します。

アクション application/x-httpd-php /cgi-bin/
/cgi-bin/ ディレクトリで php-cgi が見つからない場合は、bin から 1 つを cp できます。 php.

次に、Apache を再起動し、テスト ページを開くと、サーバー API が CGI/FastCGI に変更されることを確認します。説明: CGI モードに正常に切り替えられました。場合: 質問:


1) CGI プログラムが /usr/local/httpd/cgi-bin/miles に配置されている場合、403 または 500 エラーが発生した場合は、Apache エラー ログを開きます。 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 Process Manager)] (IIS Isapi または Apache Module );

(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 insta

をインストールします

その後インストール、

/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 内の php-cgi bin ディレクトリは fastcgi です。 PHP インタープリタが正常にインストールされたら、

php -v 输出
PHP 5.3.2 (cgi-fcgi).

を実行します。 ここの出力には cgi-fcgi

が含まれています。 注:


1 コンパイル パラメータは追加できません –with-apxs=/usr /local/ httpd/bin/apxs それ以外の場合、インストールされた php 実行ファイルは cli モードになります

2 コンパイル時に –disable-cli を追加しない場合は、PHP 5.3.2 (cli)

3) apache を設定します

必要がありますapache が fastcgi モードを使用して php プログラムを実行するように設定します

vi httpd.conf

仮想マシンを使用して実装します:

#加载fastcgi模块
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
<VirtualHost *:80>
   #
   DocumentRoot  /usr/local/httpd/fcgi-bin 
   ServerName www.fastcgitest.com
    
   ScriptAlias /fcgi-bin/  /usr/local/php/bin/  #定义目录映射 /fcgi-bin/ 代替 /usr/local/php/bin/
   Options +ExecCGI
   AddHandler fastcgi-script .php .fcgi     #.php结尾的请求都要用php-fastcgi来处理
   AddType application/x-httpd-php .php   #增加MIME类型
   Action application/x-httpd-php /fcgi-bin/php-cgi #设置php-fastcgi的处理器: /usr/local/php/bin/php-cgi
 <Directory /usr/local/httpd/fcgi-bin/>
   Options Indexes ExecCGI
   Order allow,deny
   allow from all
 </Directory>
</VirtualHost>




4) Apache で再起動し、サーバー情報が次の場合は phpinfo を確認します。 :

Apache/2.2.11 (Unix ) mod_fastcgi/2.4.6 などは、インストールが成功したことを意味します。

403 エラーが発生した場合は、/usr/local/httpd/fcgi-bin/ に十分な権限があるかどうかを確認してください。
でも

<Directory />
  Options FollowSymLinks
  AllowOverride None
  Order deny,allow
  Deny from all
</Directory>

でも大丈夫です。

ps -ef|grep php-cgi は、10 個の fastcgi プロセスが実行中であることを確認できます。


3. CLI モード

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

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

りー



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

2. コマンドラインで PHP コードを直接実行します。

php -r "print_r(get_define_constants());"

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

3. 標準入力 (stdin) を通じて実行する必要がある PHP コードを提供します。

上記の使用法により、次の例に示すように、PHP コードを動的に生成し、コマンド ラインからこれらのコードを実行できるようになります。 FINAL_OUTPUT.TXT

4. モジュールモード

モジュールモードは MOD_PHP5 モジュールの形で統合されています。このとき、MOD_PHP5 モジュールの役割は、Apache によって送信された 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 に次の行を追加する必要があります。

この動作モードは、Windows 環境で Apache サーバーを使用するときによく使用されるもので、モジュール化 (DLL) では、PHP が Web サーバーと一緒に使用されます。稼働中です。 (PHPの動作効率を高速化するためのCGIベースのApacheの拡張です)

LoadModule php5_module modules/mod_php5.so

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

5 ISAPI モード

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

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

6. Nginx での PHP 実行モード (Nginx+ PHP-FPM)

FastCGI を使用する場合、2 つの一般的なスタックがあります: lighthttpd+spawn-fcgi、もう 1 つは nginx+PHP-FPM (spawn-fcgi も使用できます)。

A. 上で述べたように、どちらの構造も FastCGI を使用して PHP をサポートしているため、HTTPServer は完全に解放され、より適切に応答し、同時に処理できます。したがって、lighttpd と nginx は両方とも、小さいながらも強力で効率的であるという評判を得ています。

B. spawn-fcgi は lighttpd の一部であるため、lighttpd がインストールされている場合、PHP をサポートするために spawn-fcgi が使用されることになります。ただし、一部のユーザーは現在、lighttpd の spwan-fcgi を使用していると考えています。は使用されません。同時アクセスが多いと、前述のメモリ リークが発生し、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 の組み合わせを使用する人が徐々に増えています

現在 7.

基本的に、HTTPServer には 3 つの人気のあるスタックがあることがわかります:

(1) Apache+mod_php5
(2) lighttp+spawn-fcgi

(3) nginx+PHP-FPM



後者のパフォーマンス3 つのうち 2 つは可能です。 若干優れていますが、豊富なモジュールと機能により、Apache が依然としてリーダーです。一部の人々は、高同時実行条件下では nginx+PHP-FPM が Apache+mod_php5 の 5 ~ 10 倍に達する可能性があることをテストしました。現在、nginx+PHP-FPM を使用する人が増えています。

PHP 動作モードの概要に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

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