composer outdated --all 不显示 PHP 升级后不兼容,因其仅比对包最新版本与 composer.json 约束,不校验当前 PHP 环境、platform.php 配置及包自身 require.php 三者交集;需配合 php -v、composer why-not php:8.4、--dry-run 等验证真实兼容性。

composer outdated --all 为什么看不出 PHP 升级后的不兼容?
composer outdated 本身不校验 PHP 版本兼容性,它只比对 composer.json 中声明的约束与 Packagist 上最新可用版本。如果你刚把 PHP 从 8.1 升到 8.4,但 composer.json 里还写着 "php": "^8.1",它照样会把 laravel/framework 10.48.20 标为“可升级”,哪怕这个版本在 PHP 8.4 下根本装不上——因为 Laravel 10 官方要求是 PHP ≥8.1 且 ≤8.3。
真正决定“能不能升”的,是当前运行环境 + platform.php 配置 + 包自身的 require.php 声明三者交集。而 outdated 只看最后一个。
- 运行
php -v确认 CLI 实际版本(别信composer show --platform php,它可能被config.platform.php覆盖) - 执行
composer config platform.php查是否锁定了模拟版本 - 用
grep '"php"' composer.json看项目声明的最低/上限要求
怎么快速识别哪些包在新 PHP 下真不能升?
靠肉眼扫 outdated --all 输出太慢,也容易漏掉间接依赖。更有效的是组合命令定位真实冲突点:
- 查谁在拦着你升 PHP:运行
composer why-not php:8.4,它会列出所有require.php不含8.4的包,以及它们被谁引入 - 过滤出已支持新版本的包:比如 PHP 8.4 下只信任
^8.4或^8.3 || ^8.4的包,可用composer outdated --format=json | jq -r '.packages[] | select(.latest | contains("8.4") or contains("8.3")) | .name' - 验证单个包能否装:执行
composer update vendor/package --dry-run -v,如果报Your requirements could not be resolved并提到ext-mbstring或function xml_parser_create已废弃,说明该包还没适配 PHP 8.4
主版本跃迁 + ! 号警告,到底要不要升?
在 outdated --all 输出里看到 symfony/console 5.4.36 → 6.4.10 ! 这类带感叹号的行,不是提示“快升”,而是警告“升了可能崩”:
立即学习“PHP免费学习笔记(深入)”;
-
!表示新版含重大变更(BC break),比如移除了ConsoleOutput::getStream(),或把Command::execute()的返回类型从int改成int|void - 主版本跃迁(如 5→6)通常伴随 PHP 版本要求提升,必须查该包 CHANGELOG 或官网文档,确认是否支持你当前的 PHP 8.4
- 即使能装上,也要跑
vendor/bin/phpunit——很多问题只在运行时暴露,比如TypeError或ArgumentCountError,outdated完全不负责这事
为什么删了 vendor 和 lock 文件后,composer install 还失败?
这不是网络或权限问题,而是 Composer 缓存里还存着旧平台解析结果。PHP 升级后,composer install 默认复用 composer.lock 中为旧 PHP 解出的版本,而这些版本在新环境下可能依赖已被移除的函数(如 mysql_connect)或扩展(如 ext-apcu)。
- 必须先执行
composer clear-cache,否则它会继续用 PHP 8.1 下缓存的monolog/monolog 2.10.0兼容性判断 - 再删
vendor/和composer.lock,然后跑composer install—— 这才是让 Composer 基于当前 PHP 8.4 重新计算整个依赖图的唯一可靠方式 - 如果跳过
clear-cache直接重装,错误信息里仍会出现requires php ^7.4 || ^8.1这种明显过时的约束链
真正麻烦的从来不是命令怎么敲,而是你得同时盯住三个地方:本地 php -v 输出、composer.json 里的 require.php、以及每个待升级包自己声明的 require.php —— 少一个对不上,outdated 就只是个漂亮但没用的列表。



















