ホームページ  >  記事  >  バックエンド開発  >  4 つの PHP 実行モードの詳細な説明

4 つの PHP 実行モードの詳細な説明

小云云
小云云オリジナル
2018-05-12 11:26:415183ブラウズ

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

1) cgi Common Gateway Interface)

2) fast-cgi Resident (long-live) CGI php-fpm

3) cli コマンドライン操作 (コマンドラインインターフェイス)

4) Web モジュールモード (Apache などの Web サーバーによって実行されるモジュールモード)

1. CGI (Common Gateway Interface)

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 が常にパフォーマンスが低く、リソース消費量が多いことで悪名が高い理由です。 CGI モードのインストール:

CGI はすでに古いモードで、近年ではほとんど使用されていないため、テストに使用しました。

CGI モードをインストールするには、LoadModule php5_module modules/libphp5.so の行をコメントアウトする必要があります。この行をコメントしない場合は、ハンドラー モードまで進みます。それがモジュールモードです。

次に、httpd.conf にアクションを追加します。

Action application/x-httpd-php /cgi-bin/

/cgi-bin/ ディレクトリで php-cgi が見つからない場合は、次の場所から cp できます。 PHP 1 のビン。

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

質問:

1) /usr/local/httpd/cgi-bin/ で CGI プログラムを実行できず、403 または 500 エラーが発生した場合

Apache エラー ログを開くと、次のプロンプトが表示されます: Permission Deny: exec of

cgi を確認できます。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

注: 宣言後に 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 は独立したプロセス プールで CGI を実行します。1 つのプロセスが停止した場合、システムはそれを簡単に破棄し、ロジックを実行する新しいプロセスを再割り当てします。 Fastcgi は分散コンピューティングをサポートしているようです。Fastcgi はホスト サーバーから完全に独立しています。どんなに fastcgi がダウンしても、サーバーはダウンしません。

3) パフォーマンスの観点から、fastcgi は動的ロジックの処理を分離します。負荷の IO 処理は依然としてホスト サーバーに任せられるため、通常の動的 Web ページの場合、論理的な処理はほんの一部であり、ホスト サーバーは IO に集中できます。画像の数やその他の静的

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

./ を再コンパイルします。このようにコンパイルした後、bin に php-cgi を追加します。 PHP のディレクトリー これは、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 を設定します

fastcgi モードで php プログラムを実行するには、apache を設定する必要があります

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>
 
或者
<IfModule mod_fastcgi>ScriptAlias /fcgi-bin/ "/usr/local/php/bin"
 #定义目录映射FastCgiServer /usr/local/php/bin/php-cgi   -processes 10 
 #配置fastcgi server,<Directory "/usr/local/httpd/fcgi-bin/">
 SetHandler fastcgi-scriptOptions FollowSymLinksOrder allow,denyAllow from all
 </Directory>AddType application/x-httpd-php .php  
 #增加MIME类型AddHandler php-fastcgi .php   
 #.php结尾的请求都要用php-fastcgi来处理Action php-fastcgi /fcgi-bin/php-cgi 
 #设置php-fastcgi的处理器
</IfModule>

4).restart 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>
改为:
<Directory />
    Options FollowSymLinks
    AllowOverride None
Order allow,deny
Allow from all
</Directory>

で構いません。

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

3. CLI モード

cli は、PHP のコマンドライン実行モードです。よく使用しますが、気づかないかもしれません (例: PHP のインストールを見つけるには、よく「php -m」を使用します)。 Linux これらの拡張機能は 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 コードを動的に生成し、コマンド ラインからこれらのコードを実行できるようになります。 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を拡張したものです)

[plain]view plaincopyprint?

1 LoadModule php5_module modules/mod_php5.so

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

関連する推奨事項:

PHP 動作モードの概要

以上が4 つの PHP 実行モードの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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