PHP の緊急の修正が出たあと、自分のサーバーに修正が入ったかを確かめようとして、SSH でつないで php -v を打つことがあります。そこに出るのは、コマンドラインで動く PHP(CLI)のバージョンです。Web のリクエストを処理している PHP とは、別のものかもしれません。
Ubuntu 24.04 の同じマシンで、CLI と、Apache から呼ばれる PHP-FPM を並べました。
| 確かめ方 | 出た値 |
|---|---|
SSH で php -v
|
PHP 8.4.21 (cli) |
Web で PHP_VERSION を出す |
8.3.6 |
CLI で PHP_SAPI
|
cli |
Web で PHP_SAPI
|
fpm-fcgi |
| CLI で読み込んだ php.ini | /etc/php/8.4/cli/php.ini |
| Web で読み込んだ php.ini | /etc/php/8.3/fpm/php.ini |
| WordPress のサイトヘルスの PHP(Web から開く) | 8.3.6、fpm-fcgi |
| 同じサイトヘルスの値を CLI から読む | 8.4.21、cli |
php というコマンドが指す PHP と、Web から呼ばれる PHP は、バージョンも、読み込む php.ini も違いました。
先に断っておくと、CLI と Web で SAPI が違い、php.ini も別に読めることは、PHP マニュアルの「コマンドラインでの PHP の使用」の章に書かれています。ここで書くのは、それを1台のマシンで実際に作って並べた結果と、Web の側の値をどこで見ればいいかです。
なぜ別の PHP になるのか
Ubuntu の PHP は、バージョンごとに別のパッケージです。php8.3-cli、php8.3-fpm、php8.4-cli のように、バージョンと SAPI の組み合わせで入ります。php というコマンドは、そのうちの1つを指すリンクです。
$ which -a php php8.3 php8.4
/usr/bin/php
/usr/bin/php8.3
/usr/bin/php8.4
$ ls -l /usr/bin/php
/usr/bin/php -> /etc/alternatives/php
このマシンでは、php は 8.4 を指していました。Web の側は、Apache から php-fpm8.3 に渡す設定にしています。php が何を指すかと、Web がどの PHP に渡すかは、別々に決まります。
違うのはバージョンだけではない
並べている途中で、もう1つ違いに当たりました。最初に WordPress を Web から開くと、こう出ました。
Your PHP installation appears to be missing the MySQL extension which is required by WordPress.
Please check that the mysqli PHP extension is installed and enabled.
CLI からは、同じ WordPress が問題なく動いていました。CLI の 8.4 には mysqli が入っていて、Web の 8.3 には入っていなかったからです。php -m で拡張の一覧を見ても、見えているのは CLI のほうだけです。php8.3-mysql を入れて PHP-FPM を起動し直したら、Web でも動きました。
拡張も、php.ini の設定も、SAPI ごとに別です。CLI で確かめた結果は、Web の結果の代わりになりません。
Web の側の値を見る方法
PHP_VERSION を出すだけのファイル
公開ディレクトリに、推測されにくい名前のファイルを置いて、ブラウザで開きます。
<?php
header('Content-Type: text/plain');
printf("PHP_VERSION=%s\nPHP_SAPI=%s\nphp.ini=%s\n",
PHP_VERSION, PHP_SAPI, php_ini_loaded_file());
PHP_VERSION=8.3.6
PHP_SAPI=fpm-fcgi
php.ini=/etc/php/8.3/fpm/php.ini
確かめたら、すぐに消します。phpinfo を出すファイルでも同じことが分かりますが、出る情報が多いぶん、置きっぱなしにしたときの害も大きくなります。
WordPress のサイトヘルス
WordPress なら、管理画面の「ツール → サイトヘルス → 情報 → サーバー」に、PHP のバージョンと SAPI が出ます。管理画面は Web から開くので、Web の PHP の値です。
同じ値を、CLI から WordPress を読み込んで取り出すと、CLI の値になりました。
== Web
php_version: 8.3.6 (Supports 64bit values)
php_sapi: fpm-fcgi
== CLI
php_version: 8.4.21 (Supports 64bit values)
php_sapi: cli
WP-CLI も CLI の PHP で動きます。WP-CLI で出したサイトヘルスの情報は、Web の PHP のものではない、ということです。
修正が入ったかを確かめるとき
- SSH の
php -vは、CLI の PHP。Web の PHP とは別のことがある - バージョンも、拡張も、php.ini も、SAPI ごとに別
- Web の値は、Web から開くもの(
PHP_VERSIONを出すファイル、phpinfo、サイトヘルス)で見る - WP-CLI も CLI の PHP で動く。WP-CLI の出力は Web の値ではない
- 確かめるために置いたファイルは、すぐに消す
あなたのサーバーで、php -v と Web の PHP_VERSION は同じですか。
手元で試す設定
php8.3-fpm を apt で入れ、TCP で待ち受けるプールを1つ作って起動しました。
; fpm.conf
[global]
pid = /path/to/fpm.pid
error_log = /path/to/fpm.log
[www]
user = root
group = root
listen = 127.0.0.1:19000
pm = static
pm.max_children = 2
php-fpm8.3 -R -y /path/to/fpm.conf -c /etc/php/8.3/fpm/php.ini
Apache は、mod_proxy と mod_proxy_fcgi を読み込んで、.php を PHP-FPM に渡します。
<FilesMatch "\.php$">
SetHandler "proxy:fcgi://127.0.0.1:19000"
</FilesMatch>
CLI の php は、もともと入っていた php8.4-cli を指したままです。
ふだんはraplsworks.comで、WordPressプラグイン開発やClaude Codeまわりのことを書いています。
https://raplsworks.com/