タイトル: Your requirements could not be resolved to an installable set of packages. ... To enable extensions, verify that they are enabled in your .ini files:
SEOタイトル: Composerの依存解決エラーの読み方と対処法|PHP・拡張・lock
依存解決エラーの入口:総括メッセージだけでmbstring不足と決めず、すべてのProblemを読みます。下の旧Laravel 5.5ログは読解用で、新規導入の推奨ではありません。
エラー内容
Your requirements could not be resolved to an installable set of packages.
Problem 1
- laravel/framework v5.5.9 requires ext-mbstring * -> the requested PHP extension mbstring is missing from your system.
- laravel/framework v5.5.8 requires ext-mbstring * -> the requested PHP extension mbstring is missing from your system.
- laravel/framework v5.5.7 requires ext-mbstring * -> the requested PHP extension mbstring is missing from your system.
(以下、候補バージョンの数だけ同じ行が続く)
install、update、require、create-project などで依存条件を満たせない場合に表示されます。この旧ログの候補行は同じmbstring不足を示しますが、全エラーの原因が1つとは限りません。候補を実際にインストールして失敗した記録ではなく、依存解決の説明です。
このメッセージの読み方
Composer は「要求を満たす組み合わせが 1 つも作れなかった」ときにこのメッセージを出します。本当の原因は Problem ブロックの中に書かれています。
- すべてのProblemブロックを読む。独立した拡張不足・PHP制約・依存競合が同時に存在し得ます。番号の数が根本原因の数と厳密に一致するとは限らず、1つ直しても残りは解消しません。
- 矢印の右だけでなく、要求元パッケージ・要求する対象・制約・実際の環境を対にして読みます。競合やlock固定の説明は複数行にまたがることがあります。
- 希望する版・rootの制約・lockで固定された版を確認します。最新版の行だけを選ぶと、実際に固定している依存関係を見落とします。
よくある 4 つの原因
| Problem 行の書かれ方 | 原因 | 対処 |
|---|---|---|
requires ext-xxx * -> the requested PHP extension xxx is missing |
Composerに見えるプラットフォームに拡張がない(未導入・未読込・設定上の非表示を区別) | PHP 拡張が無いときの対処 |
requires php ^8.1 -> your php version (8.0.x) does not satisfy that requirement |
PHP 本体のバージョンが要求を満たさない | CLIの実版とconfig.platform、アプリの対応範囲を照合。保守中のPHPへの移行か、検証済み依存の選定を別途計画する |
conflicts with / don't satisfy が出る |
パッケージ同士のバージョン競合 | まずcomposer why-not ベンダー名/パッケージ名 バージョンで制約の連鎖を調べる。制約の無条件緩和はしない |
requires ext-... だが本番では入っている |
CLI と Web で読む php.ini が違う | php -m と php --ini で CLI 側を確認する |
installかupdateかを先に確認する
| 状態 | 判断と次の確認 |
|---|---|
| composer.lockがあるinstall | 固定済みの版を再現します。環境不足なら環境を直し、lockを削除して解決し直しません。composer.jsonとlockが食い違えば変更の意図と差分を確認します。 |
| lockがないinstall | 依存を新しく解決し、通常はlockを作ります。既存環境の再現と同じではありません。配備なら、まず正しい管理済みlockの有無を確認します。 |
| update / require | 制約の範囲で解決し直し、通常はlockが変わります。拡張不足の万能修復ではありません。更新が必要な場合は検証用コピーで対象を絞り、依存差分とアプリテストをレビューします。 |
独立した問題を分けて記録する
例えばProblem 1がext-mbstring不足、Problem 2がPHPの版不適合なら、拡張を読み込ませてもPHP要件は残ります。各ブロックについて「要求元 → 要求対象と制約 → 実値/固定版 → 変更候補」を1行ずつメモします。競合なら直接依存だけでなく、その先の制約まで追います。エラー行の繰返し回数を修復件数とは数えません。
同じCLIとComposer設定を照合する
以下は信頼できる作業コピー内での診断例です。先にUnix系ならcommand -v phpとcommand -v composer、PowerShellならGet-Command php,composer -Allでランチャーも調べます。必要なら確認済みのPHPの絶対パスで、確認済みのcomposer.pharを明示して起動し、同じPHPで各検査を揃えます。表示結果のパス・URL・設定値は共有前に秘密情報を除いてください。
php -v
php --ini
php -m
php --ri mbstring
composer --no-plugins --no-scripts show --platform
composer --no-plugins --no-scripts config --list --source
php --iniでは主iniだけでなく追加読込先も確認します。PHPRC、PHP_INI_SCAN_DIR、起動時の-c/-nで差が出ます。php --ri mbstringが成功しても別のPHPで起動したComposerの証明にはなりません。
config --list --sourceで有効値と由来を確認し、config.platformによるPHP/拡張の上書きやfalseでの非表示を調べます。設定は解決対象を模擬するだけでPHP/拡張を導入しません。エラー回避のために本番にない拡張をあることにせず、意図した配備環境との一致を確認します。
lockがある作業コピーで確認する順番
以下はcomposer.lockがある場合だけの順序です。validateでJSON/lockの整合性、check-platform-reqs --lockで固定依存が要求する実際のCLI環境を確認します。後者はconfig.platformを無視し、vendor未導入でもlockを基準に検査できます。失敗したらそこで止め、環境/変更意図を修正して再確認します。通常の開発依存も対象で、本番でrequire-devを除く配備ならその範囲を決めて--no-devを使います。
composer --no-plugins --no-scripts validate --check-lock
composer --no-plugins --no-scripts check-platform-reqs --lock
composer --no-plugins --no-scripts install --dry-run
dry-runはサンドボックスではありません。--no-plugins --no-scriptsは第三者コードの経路を減らす指定で、任意の不審なプロジェクトを安全にする保証ではありません。通常のComposerコマンドにもプラグインのイベントがあり、--no-scriptsだけではプラグインを止めません。通信やキャッシュの影響も別です。不明なコードは秘密値を持たない隔離環境で扱います。
この確認ではアプリ固有のプラグイン/スクリプトは動かしていないため、本来のビルドや初期化の成功は未検証です。承認された本実行とアプリテストを別に行い、終了コード0やplatform検査だけでWeb/FPM・キュー・本番全体の互換性を保証しません。lock削除、無差別update、全OS更新、要件の無視は診断の代わりになりません。
出典確認:2026年10月26日。Composer公式CLI(install/update・why-not・check-platform-reqs)、config.platform、仮想プラットフォーム依存、第三者コードと隔離の注意、PHP設定ファイル、mbstring導入条件。
原因の切り分け
まずどのパッケージが何を要求しているかを確定させます。
旧診断例の注意:次のブロックは記録のため保持しています。10.0は旧例の対象で、現在選ぶべき版ではありません。composer update --dry-runもプラグイン等の第三者コードや通信・キャッシュへの影響を排除する指定ではありません。そのまま実行せず、先に下記のプラグイン/スクリプト無効化・lock別の手順を使います。
# 入れたいバージョンが入らない理由を Composer に説明させる
composer why-not laravel/framework 10.0
# 今の環境が満たしているプラットフォーム要件を一覧する
composer show --platform
# 何が変わるかだけ見る(実際には入れない)
composer update --dry-run
why-not(prohibits)は指定版を妨げる依存を説明します。常に1行ではありません。対象の実在版を指定し、lockを調べるなら--locked、依存の連鎖には--treeを検討します。未installでlockもない状態の診断とは前提が異なります。
対処法(Linux)
mbstring不足が実際のCLIでも確認できた場合だけ、対象PHPと同じ配布元・版の拡張を検討します。次の旧例は実行手順として使いません。php-mbstringが意図した版を選ぶとは限らず、php8.2-fpmというサービス名も環境固有です。CLIのComposerを直すためのFPM再起動は不要です。上の診断・lock確認に戻ってください。
sudo apt install php-mbstring
sudo systemctl restart php8.2-fpm # FPM を使っている場合
composer install
拡張の入れ方や、入れたのに認識されない場合の確認手順はthe requested PHP extension ... is missing from your systemに分けてまとめています。
--ignore-platform-reqs を使う前に
--ignore-platform-reqsはPHP・拡張等の要件を無視する指定で、依存競合などまで解消するものではありません。install成功も実行可能性の証明ではなく、拡張欠落ならmb_strlen()等で実行時エラーになり得ます。エラーを消す目的で付けず、必要な環境を整えます。
- 旧説明の訂正:静的解析だから安全とは言えません。解析ツール自身やbootstrap・autoload・プラグイン・スクリプトはPHPコードを実行し、同じPHP/拡張を要求し得ます。CIでもまず要件を満たす隔離環境を使います。
- 特定要件だけの無視指定も互換性を保証しません。例外を評価する場合は対象・理由・実行範囲を限定した別検証として扱い、通常の本番/開発install手順にしません。
関連記事
- the requested PHP extension ... is missing from your system — PHP 拡張が足りない場合の対処
- PHP — 言語のカテゴリ