◀ 6.

Composerの依存解決エラーの読み方と対処法|PHP・拡張・lock

▶

依存解決エラーの入口:総括メッセージだけでmbstring不足と決めず、すべてのProblemを読みます。下の旧Laravel 5.5ログは読解用で、新規導入の推奨ではありません。

実行PHP、Composer設定、lockと全Problemを順に照合し、要件を直した後に再検査する診断フロー

エラー内容

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 ブロックの中に書かれています。

  1. すべてのProblemブロックを読む。独立した拡張不足・PHP制約・依存競合が同時に存在し得ます。番号の数が根本原因の数と厳密に一致するとは限らず、1つ直しても残りは解消しません。
  2. 矢印の右だけでなく、要求元パッケージ・要求する対象・制約・実際の環境を対にして読みます。競合やlock固定の説明は複数行にまたがることがあります。
  3. 希望する版・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もプラグイン等の第三者コードや通信・キャッシュへの影響を排除する指定ではありません。そのまま実行せず、先に「同じCLIとComposer設定を照合する」と「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手順にしません。

関連記事

子ページ

子ページはありません

同階層のページ
  1. Fatal error: Maximum execution time of 30 seconds exceeded in...
  2. Fatal error: Uncaught Error: Cannot use object of type stdClass as array in ...
  3. Warning: Use of undefined constant ... - assumed '...' (this will throw an Error)
  4. ERROR: Call to undefined method Maatwebsite\Excel\Excel::load()
  5. Maximum execution time of 30 seconds exceeded
  6. Your requirements could not be resolved to an installable set of packages. ... To enable extensions, verify that they are enabled in your .ini files:
  7. could not find driver
  8. the requested PHP extension mbstring is missing from your system.
  9. the requested PHP extension dom is missing from your system.
  10. A non well formed numeric value encountered
  11. Warning: Cannot modify header information - headers already sent by ...
  12. php_network_getaddresses: getaddrinfo failed: Name or service not known
  13. XMLWriter::openUri(): Unable to resolve file path
  14. Object of class stdClass could not be converted to string
  15. Class 'Google_Service_Youtube' not found

最近更新/作成されたページ