Open6

PHPにはモジュール版、CGI版がある?!

awonosukeawonosuke

ふとdockerでPHPの実行環境を用意しよ〜と思ったところ、dockerイメージにいくつか種類がありどれを選べばいいんだ?!となったので、メモを残しておく。(大体何も考えずphp:<version>-apacheを使ってた)
https://hub.docker.com/_/php
https://github.com/docker-library/docs/blob/master/php/README.md#supported-tags-and-respective-dockerfile-links

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由来になる

awonosukeawonosuke

この記事でPHPの実行方法にモジュール方式、CGI方式があることを知る。そして、Apacheでは両方利用できることを知る。
→じゃあApacheを利用する場合、どう使い分ければいい??という疑問が生まれる
https://www.fumi.org/neta/201205sv.html

ちなみにCGIでは脆弱性が指摘されていた(URLクエリパラメータを利用し、ソースコードが見れたらしい)が、今は修正されている模様。
https://blog.tokumaru.org/2012/05/php-cgi-remote-scripting-cve-2012-1823.html

公式ドキュメントにCGI利用でのリスク、対策がまとめられてる。
https://www.php.net/manual/ja/security.cgi-bin.attacks.php

話が逸れたので本題に戻す。
そういえば、dockerの公式イメージの中にphp-apacheがあるから、それがどちらを採用してるか確認してみようと思う。

何やらmod_phpって書いてある。なるほどつまり、Apacheはモジュール(Webサーバーのプロセス)でPHPスクリプトを実行するのが普通っぽい?

This image contains Debian's Apache httpd in conjunction with PHP (as mod_php) and uses mpm_prefork by default.

https://hub.docker.com/_/php

なので、Apacheではモジュール型を利用し(CGIも利用可能)、他のWebサーバーソフトウェアを利用するならPHP-FPMの利用をする。という理解に落ち着いた。

以下はその根拠になり得るであろう参考記事をまとめた。

Nginx、PHP-FPMでのやり取りについてなど解説してくれてて分かりやすかった。
https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc

mod_phpはApache用のモジュールなので(以下略
nginxからphpを実行するためにはCGI経由で実行する必要があります。(CGI経由のphp実行自体はApacheでもできますけどネ)

https://qiita.com/nayuneko/items/a3b326e2e9466e4117d6

awonosukeawonosuke

CGIとは?

Webサーバ上にあるプログラムを動かすための仕組み

https://wa3.i-3-i.info/word12806.html

FastCGIとは?

役割はCGIと同じだけど、Webサーバ上で動くプログラムを一度起動したらしばらく待機させることによって、プログラムの開始と終了にかかる手間を減らし、動きを速くしたりWebサーバの負荷を軽減することができる仕組み

https://wa3.i-3-i.info/word112.html

awonosukeawonosuke

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は、複数のリクエストについて、継続的にメモリを使用することで、そのメモリを再利用し、より素早くレスポンスを返すことができます。

https://www.flying-h.co.jp/media/2022/11/16/php-cli-and-php-fpm/