composer show --platform-check 仅粗筛平台兼容性却不报具体冲突,需用 composer why-not php:x.x 定位不兼容包、composer depends --tree 查依赖链、php -m 验证扩展,并注意 config.platform 的伪版本干扰。

composer show --platform-check 会报错但不告诉你具体哪不兼容
它只返回一个模糊的 Platform check failed,连哪个包、哪个 PHP 扩展、哪个版本范围冲突都不列。这不是 bug,是设计如此——composer show 本意是查包信息,--platform-check 只是顺带做一次粗筛,不是诊断工具。
真正要定位问题,得换命令:
- 先用
composer why-not php:8.2(把8.2换成你实际的 PHP 版本)看哪些包直接声明了不兼容 - 再用
composer depends --tree vendor/package-name查某个包被谁依赖,避免误删“无辜中间层” - 如果报错里提到扩展(比如
ext-intl),运行php -m | grep intl确认是否已启用,别只信phpinfo()页面
packagist.org 上看到的 PHP 版本范围不一定准
网页上显示的 php: ^7.4 || ^8.0 是包作者在 composer.json 里写的,但没经过实际安装验证。常见陷阱有:
- 作者写了
"php": "^8.0",但代码里用了str_contains()(PHP 8.0+),却忘了加ext-mbstring依赖,而你的环境没开这个扩展 - 包本身兼容 PHP 8.2,但它依赖的某个子包(比如
monolog/monolog的某个旧版)只到 PHP 8.1,Composer 就会卡住 - 某些包用
config.platform.php强制降级平台声明,这时composer show --platform-check看到的是假版本,不是你真实 PHP
为什么 vendor/autoload.php 能加载,但 composer install 还失败?
autoload 只管类自动加载,不校验平台兼容性。哪怕所有类都能 require 进来,只要 composer.json 里声明的 php 或 ext-* 不匹配,composer install 就会中止。
立即学习“PHP免费学习笔记(深入)”;
典型表现:
- 本地开发能跑,CI 流水线失败 → CI 的 PHP 版本或扩展列表和你本地不同
-
composer update成功,但composer install失败 →composer.lock锁的是旧版依赖,新版约束更严 - 加了
--ignore-platform-req=php临时绕过,但上线后某函数报undefined function→ 忽略不是解决,是掩盖
检查时别漏掉 config.platform 配置
项目根目录 composer.json 里如果有 "config": {"platform": {"php": "7.4.33"}},那所有平台检查都按这个走,跟你 php -v 输出无关。这是为了在高版本 PHP 上模拟低版本环境,但容易让人误以为“我 PHP 是 8.2,怎么还报 7.4 不兼容?”
快速确认方法:
- 运行
composer config --list | grep platform,看有没有被覆盖 - 临时去掉该配置,再跑
composer show --platform-check,对比结果 - 如果团队共用,建议把
config.platform写进 README,否则新成员永远猜不到为啥本地装不上
config.platform 和扩展缺失这两点,它们不会出现在报错第一行,但总在最后才被想起来。











