開発環境にシステムを入れて composer update も終わり、サイトにアクセスしたところ、次のエラーが発生しました。
Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.4.0".
PHP8.4でないと認めない!と言われているのですが…あれ、この環境はPHP8.xだったと思うんだけど…というところでハマりました。
- CLI の PHP バージョンと php-fpm のバージョンが違っていた
- Composer は CLI の PHP バージョンを基準に依存関係を解決する
- composer.json の PHP バージョン指定と実行環境が一致していなかった
目次
バージョンの確認
まずは php -v
8.4でした。…エラーメッセージで「8.4以上でないと認めない」と言っているのに、どうしてだろう?
php-fpm環境が8.3でした
開発環境はいろいろあるのでphp-fpmで任意のPHPバージョンを使えるようにしています。
今回はこれが原因でした。php-fpmで8.3指定なのに、8.4のcomposerで入れてしまっている。
- CLI の PHP は 8.4
- php-fpm は 8.3
- Composer は CLI の PHP(8.4)を基準に依存関係を解決していた
そのため、PHP8.4 前提の依存関係が composer.lock に固定され、php-fpm(8.3)で実行するとエラーになっていました。
PHP のメジャーバージョンは同じ 8.x でも、Composer は依存関係の解決時に PHP のバージョンを厳密に見ているため、このようなズレでもエラーになるようです。
PHP8.3で動作するようにcomposer.jsonを修正
今回は php-fpm が 8.3 のため、PHP8.3 で動作する構成に合わせます。
- composer.jsonを修正
- composer.lockとvendorディレクトリを削除
- PHPバージョンを指定してcomposer update
composer.jsonのPHPバージョン指定を修正
確認したら「"php": "^8.0"」となっていました。
PHP8であればマイナーバージョンまで気にしなくてもよさそうだったので、ここでは「PHP8.3以上」に修正します。
"require": {
"php": ">=8.3"
}
PHP のマイナーバージョン違いで毎回修正が必要にならないように8.3以上としました。
composer.lockとvendorを削除
composer.jsonを修正してもlockがあるとcomposer.jsonがあってもlockを優先して失敗するので、削除します。
vendorもあれば削除しておきます。
rm composer.lock
rm -rf vendor
PHPバージョンを指定してcomposer update
ここまでできたら composer update をします。
ですが、そのままcomposer updateコマンドを入れるとまたCLIのバージョン(ここでは8.4)で依存関係を解決してしまうので、PHPのバージョンを指定してから実行します。
※composerが指定のPHPバージョンと紐づいていないときは which composer でパスを探してください。
which composer
php8.3 /usr/bin/composer update
これでcomposerが想定通りに入り、無事にサイトにアクセスできるようになりました。
まとめ
php-fpm を使っている場合、`php -v` で表示される CLI の PHP と別のバージョンが使われていることがあります。
Composer でPHPのバージョン違いのエラーが出たときはCLI と php-fpm の両方の PHP バージョンを確認すると、解決の糸口が見つかるかもしれません。












