CGI/SAPI/FastCGI

仕事でPHPを使うことになりそうなのでPHP勉強中。


PHPを動かす方法。
http://fuzzytolerance.info/code/cgi-vs-sapi-vs-fastcgi/
このページを部分的に和訳してみた。
2006年の記事だからもしかしたら少し情報が古いかもしれない。

CGI(Common Gateway Interface)

CGIはウェブサーバから外部のアプリケーションを使うための標準規格。

原則はこう

  1. .php拡張子のページへのリクエストをウェブサービスが受け取る
  2. php-cgi.exeを起動し、.php拡張子のページを処理する。
  3. php-cgi.exeプロセスが終了する
メリット
  • 安定性
    • phpが実行エラーを起こしても単にそのプログラム自体が終了するだけ。
デメリット
  • パフォーマンス
    • リクエストを受ける度にプロセスを起動するから

SAPI(Server Application Programming Interface)

IISの場合は(ISAPI)と呼ぶ。
Webサーバのダイレクトモジュールインタフェースの総称。

PHPプログラムはWebサーバのプロセス内で動く。
たとえば
ISAPIでPHPを使う == PHPIISのプロセスの中で動く

メリット
  • パフォーマンス
    • phpプロセスが新たに起動することはない。だからCGIに比べるとかなり速い。
デメリット
  • 移植性
    • WebサーバによりSAPIの仕様が異なるため。
  • 不安定
    • Webサーバを巻き込んで落ちるということが起こり得る。
  • スケーラビリティ
  • セキュリティ
    • Webサーバと同じ権限で走るため。

FastCGI

CGIの良い点はそのままにパフォーマンスを改善しよう、というもの。
基本的にはCGIのラッパー。
WebサーバはFastCGIモジュールとやりとりし、FastCGITCP越しにphp-cgi.exeとやりとりする。(ので分散もできる)


FastCGIはWebサーバを起動するときに特定数のCGIプロセスを起動する。
リクエストが増えるとともにCGIプロセスの数を増やしていったり、ということもできる。

メリット
  • パフォーマンス
    • CGIでネックになっていたプロセス起動というオーバーヘッドがない
  • 安定性
  • セキュリティ
    • Webサーバプロセスの外で動くため、にも対処している。
  • スケーラビリティ
    • プロセスを違うマシンに分けることもできるのでスケールしやすい。