ホームページ >バックエンド開発 >PHPチュートリアル >PHP 実行モードの概要
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 ディレクトリにインタプリタを配置しないことが推奨されています。
CGI モードをインストールするには、LoadModule php5_module modules/libphp5.so の行をコメントアウトする必要があります。この行をコメントしない場合は、ハンドラー モードまで進みます。それがモジュールモードです。
次に、httpd.conf にアクションを追加します。 アクション application/x-httpd-php /cgi-bin/
/cgi-bin/ ディレクトリで php-cgi が見つからない場合は、bin から 1 つを cp できます。 php.
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/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 の動作原理は次のとおりです:
(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 はホスト サーバーから完全に独立しています。
FastCGI の欠点:
fastcgiモードをインストールします:
Apacheのインストールパスは/usr/local/httpd/です
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 モードになります
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 を確認します。 :
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 を入力して、この実行モードを詳しく学習できます)
りー
上記のどちらの方法でも (-f パラメーターの有無にかかわらず) スクリプトの script.php を実行できます。実行するファイルを選択できます。指定する PHP スクリプトには .php 拡張子が必要ではなく、任意のファイル名と拡張子を付けることができます。
2. コマンドラインで PHP コードを直接実行します。
php -r "print_r(get_define_constants());"
このメソッドを使用する場合は、シェル変数の置換と引用符の使用に注意してください。
注: 上記の例をよく読んでください。コードの実行時には開始マーカーと終了マーカーはありません。 -r パラメーターを使用すると、これらのマーカーは不要になり、構文エラーが発生します。
3. 標準入力 (stdin) を通じて実行する必要がある PHP コードを提供します。
上記の使用法により、次の例に示すように、PHP コードを動的に生成し、コマンド ラインからこれらのコードを実行できるようになります。 FINAL_OUTPUT.TXT
4. モジュールモード
この起動時のロード方法に加えて、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 モード
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 つのうち 2 つは可能です。 若干優れていますが、豊富なモジュールと機能により、Apache が依然としてリーダーです。一部の人々は、高同時実行条件下では nginx+PHP-FPM が Apache+mod_php5 の 5 ~ 10 倍に達する可能性があることをテストしました。現在、nginx+PHP-FPM を使用する人が増えています。