ホームページ >バックエンド開発 >PHPチュートリアル >CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI とは何ですか? (変化)

CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI とは何ですか? (変化)

WBOY
WBOYオリジナル
2016-06-23 14:29:431099ブラウズ

CGI とは何ですか?

CGIの正式名称は「Common Gateway Interface」です。簡単に言えば、WEBサーバー上で動作するプログラムです。ブラウザからの入力によってトリガーされるこのスクリプトは、通常、サーバーとシステム内の他のプログラム (データベースなど) の間のブリッジとして機能します。

CGI スクリプトの仕組み: ブラウザーは、HTML フォームまたはハイパーリンクを通じて、前の CGI アプリケーションを指す URL を要求します。 サーバーはリクエストを受信します。 サーバーは指定された CGI アプリケーションを実行します。 CGI アプリケーションは、通常、ビューアからの入力に基づいて、必要な操作を実行します。 CGI アプリケーションは、結果を Web サーバーやブラウザが理解できるドキュメント (通常は HTML ページ) にフォーマットします。 Web サーバーは結果をブラウザに返します。

FastCGI とは

FastCGI は長寿命 CGI のようなもので、アクティブ化されている限り、毎回フォークする手間がかかりません (これが CGI に関して最も批判されている点です)。フォークして実行モード)。また、分散コンピューティングもサポートしています。つまり、FastCGI プログラムを Web サイト サーバー以外のホストで実行し、他の Web サイト サーバーからのリクエストを受け入れることができます。

FastCGI は、言語に依存しないスケーラブルなアーキテクチャの CGI オープン拡張機能であり、その主な動作は CGI インタプリタ プロセスをメモリ内に保持することで、より高いパフォーマンスを得ることができます。ご存知のとおり、CGI インタープリタの繰り返しロードが CGI パフォーマンス低下の主な原因です。CGI インタープリタがメモリ内に残り、FastCGI プロセス マネージャーのスケジューリングを受け入れる場合、良好なパフォーマンス、スケーラビリティ、フェイルオーバー機能などが提供されます。

FastCGI と CGI の機能:

CGI と同様に、FastCGI は言語に依存せず、コア Web サーバーから独立したプロセスでアプリケーションを実行し、API よりも安全な環境を提供します。 (API はアプリケーションのコードをコア Web サーバーにリンクします。つまり、欠陥のある API を備えたアプリケーションが他のアプリケーションやコア サーバーに損害を与える可能性があります。悪意のある API のアプリケーション コードは、別のアプリケーションを盗む可能性さえあります。プログラムまたはコア サーバーのキー。) 現在の FastCGI テクノロジーサポート言語: C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby など。関連モジュールは、Apache、ISS、Lighttpd などの一般的なサーバーでも利用できます。 CGI と同様、FastCGI は Web サーバーの内部アーキテクチャに依存しないため、サーバー テクノロジが変わっても、FastCGI は安定したままになります。

FastCGI の仕組み:

Web サーバーが起動すると、FastCGI プロセス マネージャー (IIS ISAPI または Apache モジュール) がロードされ、FastCGI プロセス マネージャー自体が初期化され、複数の CGI インタープリター プロセス (複数の php-cgi が表示されます) からのリクエストを待ちます。 Web サーバー接続。 クライアント要求が Web サーバーに到達すると、FastCGI プロセス マネージャーが CGI インタープリターを選択して接続します。 Web サーバーは、CGI 環境変数と標準入力を FastCGI サブプロセス php-cgi に送信します。 FastCGI サブプロセスは処理を完了すると、同じ接続から標準出力とエラー情報を Web サーバーに返します。 FastCGI 子プロセスが接続を閉じると、リクエストが処理されます。次に、FastCGI 子プロセスは、(Web サーバーで実行されている) FastCGI プロセス マネージャーからの次の接続を待機して処理します。 CGI モードでは、php-cgi はこの時点で終了します。

上記の場合、CGI が通常どれほど遅いか想像できるでしょう。 PHP へのすべての Web リクエストでは、php.ini を再解析し、すべての拡張機能を再ロードし、すべてのデータ構造を再初期化する必要があります。 FastCGI では、これらすべてがプロセスの開始時に 1 回だけ行われます。さらに、永続的なデータベース接続が機能するという利点もあります。

FastCGI のデメリット

マルチプロセスなので、CGI マルチスレッドよりも多くのサーバーメモリを消費します。この数値を 50 または 100 倍すると、PHP-CGI インタプリタは 1 プロセスあたり 7 ~ 25 メガバイトのメモリを消費します。メモリの数が非常に多い。

Nginx 0.8.46+PHP 5.2.14 (FastCGI) サーバーには 30,000 の同時接続があり、開始された 10 個の Nginx プロセスは 150M のメモリ (15M*10=150M) を消費し、開始された 64 個の php-cgi プロセスは 1280M のメモリ (20M) を消費します。 *64=1280M)、システム自体が消費するメモリを加えた合計メモリ消費量は 2GB 未満です。サーバーのメモリが小さい場合は、25 個の php-cgi プロセスしか開くことができないため、php-cgi によって消費される合計メモリはわずか 500M になります。

上記のデータは、Apache (バージョン 6) よりも 10 倍優れた Web サーバーを構築するための Nginx 0.8.x + PHP 5.2.13 (FastCGI) から抜粋しています

PHP-CGI とは

PHP-CGI とはPHP Manager に付属する FastCGI。 PHP-CGI を起動し、次のコマンドを使用します:

php-cgi -b 127.0.0.1:9000

PHP-CGI の欠点

php-cgi php.ini 設定を変更した後、新しい php-ini を有効にするために php-cgi を再起動する必要があります。 . php-cgi プロセスを直接強制終了するとスムーズに再起動できなくなり、php が実行できなくなります。 (PHP-FPM と Spawn-FCGI にはこの問題はありません。デーモン プロセスは新しい子プロセスをスムーズに再生成します。)

PHP-FPM とは

PHP-FPM は、PHP でのみ使用される PHP FastCGI マネージャーです。 http://php-fpm.org/download からダウンロードできます。

PHP-FPM は実際には PHP ソース コードのパッチであり、FastCGI プロセス管理を PHP パッケージに統合することを目的としています。 PHP ソース コードにパッチを適用する必要があり、PHP をコンパイルしてインストールした後に使用できるようになります。

现在我们可以在最新的PHP 5.3.2的源码树里下载得到直接整合了PHP-FPM的分支,据说下个版本会融合进PHP的主分支去。相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。

PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多有点,所以被PHP官方收录了。在./configure的时候带 ?enable-fpm参数即可开启PHP-FPM。

使用PHP-FPM来控制PHP-CGI的FastCGI进程

/usr/local/php/sbin/php-fpm{start|stop|quit|restart|reload|logrotate} --start 启动php的fastcgi进程--stop 强制终止php的fastcgi进程--quit 平滑终止php的fastcgi进程--restart 重启php的fastcgi进程--reload 重新平滑加载php的php.ini--logrotate 重新启用log文件

 

什么是Spawn-FCGI

  Spawn-FCGI是一个通用的FastCGI管理服务器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI进行FastCGI模式下的管理工作,不过有不少缺点。而PHP-FPM的出现多少缓解了一些问题,但PHP-FPM有个缺点就是要重新编译,这对于一些已经运行的环境可能有不小的风险(refer),在php 5.3.3中可以直接使用PHP-FPM了。

  Spawn-FCGI目前已经独成为一个项目,更加稳定一些,也给很多Web 站点的配置带来便利。已经有不少站点将它与nginx搭配来解决动态网页。

  最新的lighttpd也没有包含这一块了(http://www.lighttpd.net/search?q=Spawn-FCGI),但可以在以前版本中找到它。在lighttpd-1.4.15版本中就包含了(http://www.lighttpd.net/download/lighttpd-1.4.15.tar.gz)

  目前Spawn-FCGI的下载地址是http://redmine.lighttpd.net/projects/spawn-fcgi,最新版本是http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz

下面我们就可以使用Spawn-FCGI来控制php-CGI的FastCGI进程了

/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-CGI

参数含义如下:

   -f 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置  -a 绑定到地址addr  -p 绑定到端口port  -s 绑定到unix socket的路径path  -C 指定产生的FastCGI的进程数,默认为5(仅用于PHP)  -P 指定产生的进程的PID文件路径  -u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,Ubuntu下可以使用www-data,其他的根据情况配置,如nobody、apache等

 

 

PHP-FPM与spawn-CGI对比测试

  PHP-FPM的使用非常方便,配置都是在PHP-FPM.ini的文件内,而启动、重启都可以从php/sbin/PHP-FPM中进行。更方便的是修改php.ini后可以直接使用PHP-FPM reload进行加载,无需杀掉进程就可以完成php.ini的修改加载。结果显示使用PHP-FPM可以使php有不小的性能提升。PHP-FPM控制的进程cpu回收的速度比较慢,内存分配的很均匀。

  Spawn-FCGI控制的进程CPU下降的很快,而内存分配的比较不均匀。有很多进程似乎未分配到,而另外一些却占用很高。可能是由于进程任务分配的不均匀导致的.而这也导致了总体响应速度的下降。而PHP-FPM合理的分配,导致总体响应的提到以及任务的平均。

 

 

PHP-FPM与Spawn-FCGI功能比较

http://php-fpm.org/about/

PHP-FPM、Spawn-FCGI都是守护php-cgi的进程管理器。

 

 

参考文档:

  http://topic.csdn.net/u/20100216/22/5809e272-6f67-4248-bde9-99deeae5215b.html
  http://topic.csdn.net/u/20101015/19/8ae74452-ec6b-448e-9942-21faeb008cd7.html
  http://club.topsage.com/thread-768488-1-1.html
  http://www.unixaid.info/index.php/productsapp/23-servsf/842-spawn-fcgi
  http://www.fastcgi.com/drupal/node/2
  http://baike.baidu.com/view/641394.htm
  http://baike.baidu.com/view/32614.htm
  http://blog.yation.com/network/fastcgi/

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