PHPにはモジュール版、CGI版がある?!
ふとdockerでPHPの実行環境を用意しよ〜と思ったところ、dockerイメージにいくつか種類がありどれを選べばいいんだ?!となったので、メモを残しておく。(大体何も考えずphp:<version>-apache
を使ってた)
My Conclusion
- PHPでWebアプリケーション作りたい、特にこだわりもない
→php:<version>-apache
- PHPでWebアプリケーション作りたい、WebサーバーはApache以外で
→php:<version>-fpm
- PHPで何かしたい、PHP実行できる独自イメージを作成したいなど
→php:<version>-cli
- 軽量なPHPの実行環境が欲しい
→php:<version>-alpine
※php:<version>-alpine
以外のイメージはDebian由来になる
この記事でPHPの実行方法にモジュール方式、CGI方式があることを知る。そして、Apacheでは両方利用できることを知る。
→じゃあApacheを利用する場合、どう使い分ければいい??という疑問が生まれる
ちなみにCGIでは脆弱性が指摘されていた(URLクエリパラメータを利用し、ソースコードが見れたらしい)が、今は修正されている模様。
公式ドキュメントにCGI利用でのリスク、対策がまとめられてる。
話が逸れたので本題に戻す。
そういえば、dockerの公式イメージの中にphp-apache
があるから、それがどちらを採用してるか確認してみようと思う。
何やらmod_phpって書いてある。なるほどつまり、Apacheはモジュール(Webサーバーのプロセス)でPHPスクリプトを実行するのが普通っぽい?
This image contains Debian's Apache httpd in conjunction with PHP (as
mod_php
) and usesmpm_prefork
by default.
なので、Apacheではモジュール型を利用し(CGIも利用可能)、他のWebサーバーソフトウェアを利用するならPHP-FPMの利用をする。という理解に落ち着いた。
以下はその根拠になり得るであろう参考記事をまとめた。
Nginx、PHP-FPMでのやり取りについてなど解説してくれてて分かりやすかった。
mod_phpはApache用のモジュールなので(以下略
nginxからphpを実行するためにはCGI経由で実行する必要があります。(CGI経由のphp実行自体はApacheでもできますけどネ)
CGIとは?
Webサーバ上にあるプログラムを動かすための仕組み
FastCGIとは?
役割はCGIと同じだけど、Webサーバ上で動くプログラムを一度起動したらしばらく待機させることによって、プログラムの開始と終了にかかる手間を減らし、動きを速くしたりWebサーバの負荷を軽減することができる仕組み
php-cli、php-fpmの違い
php-cli
php-cliは、Command Line Interfaceが示す通り、SSHで接続した際のコマンドラインからphpを実行する場合に使用されるプログラムです。スタンドアローンのツールのため、複数の人が同時に立ち上げても、お互いの結果などに干渉することはありません。
cliのプロセスは 1 つのコマンドに対してのみ存続し、終了するとメモリが解放されます。
MicrosoftのWordやExcelのように同じプログラムを複数起動できるイメージでしょうか。
php-fpm
php-fpmは、PHP5.4.0から公式にサポートされたPHP標準のアプリケーションサーバーとなります。サーバーですので、実際Webサーバーとして稼働した際に、ブラウザからのリクエストによりphpを実行するためのプログラムとなります。
php-fpmは、複数のリクエストについて、継続的にメモリを使用することで、そのメモリを再利用し、より素早くレスポンスを返すことができます。
php-fpmを利用する際のパフォーマンスを出すための設定最適化