今日の記事はすごくAIくさい!
久々に Windows に PHP
を入れることがあったのだが、すっかり忘れていたので整理した。
結論
先に結論を置いておく。(あくまでも基本的には)
Webサーバー | 使うPHP |
---|---|
CLI | CLI + NTS |
IIS | FastCGI + NTS |
Apache | module + ZTS |
nginx | PHP-FPM + NTS |
今何を使ってるかの判定はこちらで。
$ asdf -v
asdf version v0.18.0 (revision 2114f1e)
$ php -v
PHP 8.4.8 (cli) (built: Jun 12 2025 20:46:14) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.4.8, Copyright (c) Zend Technologies
$ php -i | grep "Thread Safety"
Thread Safety => disabled
普通に入れると cli
の NTS
になるみたい。
PHP の種類
実は PHP には大きく分けて3種類あるらしいよ。
SAPI
は Server API
っていう概念みたい。
【CLI】 コマンドラインで実行するもの
普通に PHP コマンドを実行するときのもの。
【モジュール】 直接 Web サーバーのモジュールとして実行するモード
PHP は、Webサーバーと一緒に使うことが多い。
その時、Webサーバーの内部に、モジュール、プラグイン形式で搭載して利用するもの。
Webサーバー内部で実行されるため、とても高速。
だがセッション数の制限やセキュリティ面の問題もあり、若干すたれてきている。
Apache でよく使われる。
【CGI】 CGI や FastCGI を利用して実行するモード
CGI
は Common Gateway Interface
の略。
Webサーバー内部の処理を別のプロセスに分離しようというもの。
こうすることで、Webサーバーとは別のユーザーでプログラムを実行できたりと、良い点が多い。
ただリクエストごとにPHPのプロセスを立ち上げて、とするとボトルネックになる。
そこでベースを常にメモリ上に展開して管理しようとしたのが FastCGI
。
プロセスやリソースの管理をまとめてやってくれる。
PHP では FPM
という FastCGI Process Manager
が使われている。
nginx でよく使われる。
PHP のビルド種別
PHPにはもう一個種類がある。
それが NTS
と ZTS
のスレッド対応の区別だ。
- NTS: Non Thread Safe
- ZTS: Zend Thread Safe
スレッドセーフとは、複数のスレッド(処理)が互いに独立していて、互いに影響を与えないという意味。
つまりあるリクエスト処理中に、ほかのリクエストにの処理をしても大丈夫ということ。
この二つは好きなほうを使ってよさそうで、そうではない。
例えば Apache
サーバーの場合、リクエストの処理は Webサーバーと同じプロセスで処理されるため、スレッドセーフである必要がある。
一方CGIを利用する場合、リクエストごとにPHPを立ち上げるので、スレッドセーフの必要がないです。
つまり、利用する環境に合わせて選択する必要があります。
そういえば Apache PHP が主流だったとき、新生の nginx に乗り換えようと思ったら PHP が動かなかった記憶が。。。