答案是环境不匹配,不是依赖冲突。新版Composer(2.x+)对composer.lock中平台约束更严格,PHP版本或扩展不匹配会导致安装失败,需用php -v、composer show php和composer why-not php:8.2精准排查。

composer install 报 “Your requirements could not be resolved” 是环境不匹配,不是依赖冲突
新版 Composer(2.x+)对 composer.lock 中记录的平台约束更严格,旧项目往往在 PHP 7.4 或 8.0 下开发并锁定依赖,而你本地是 PHP 8.2 或 8.3——哪怕只差一个小版本,monolog/monolog v3.5.0 这类包就可能因声明了 "php": ">=8.1" 直接拒绝安装。
常见表现不是“找不到包”,而是报错后连 vendor/ 都没生成。别急着删 composer.lock,先确认三件事:
- 运行
php -v和composer show php,看输出是否一致;不一致说明composer.json里"config": {"platform": {...}}写死了旧版本,但你没配对 - 检查
composer.lock顶部的platform字段(如有),它比composer.json的config.platform优先级更高 - 用
composer why-not php:8.2直接查哪个已锁包在拦路,比手动翻依赖树快得多
旧项目用了私有源,但新版 Composer 默认忽略 repositories 配置
Composer 2.2+ 引入了更严格的源验证机制:如果 composer.json 里的 "repositories" 缺少 "type": "composer" 或 URL 不以 / 结尾,新版会静默跳过该源,退回到官方源查包——结果就是 Package not found,但错误里不提配置问题。
尤其注意旧项目常写成:
"repositories": [
{
"type": "package",
"url": "https://your-internal/repo.json"
}
]
这在 Composer 1.x 可能凑合跑通,2.x 要求必须是 "type": "composer" 且 URL 是完整镜像地址(如 https://pkg.example.com/),否则直接失效。
- 验证方式:运行
composer config repositories,输出应包含你配置的源;空或只有 packagist 才说明没生效 - 修复方法:删掉旧
repositories数组,改用composer config repo.packagist composer https://your-mirror/(不加-g)写入项目级配置 - 私有包绝对不能指望阿里云、腾讯这些公共镜像同步——它们压根不拉取你的内网源
composer install 卡在 “Loading composer repositories” 不是网络慢,是 CA 证书过期
新版 Composer 默认启用 HTTPS 验证,而很多旧服务器仍用停更于 2021 年的 curl-ca-bundle.crt,导致访问所有 HTTPS 镜像(包括阿里云、华为云)时 SSL 握手失败,表现就是卡住不动或报 cURL error 60。
- 快速验证:执行
openssl s_client -connect mirrors.aliyun.com:443 -servername mirrors.aliyun.com,看是否返回Verify return code: 0 (ok) - 修复路径:下载最新
cacert.pem(地址:https://curl.se/ca/cacert.pem),然后在php.ini中统一设置:openssl.cafile=/path/to/cacert.pem和curl.cainfo=/path/to/cacert.pem - 临时绕过(仅调试):
composer config -g secure-http false,但上线前必须撤掉
vendor/autoload.php 加载失败,90% 是 autoload 配置错位,不是 install 没跑完
composer install 成功不代表项目能跑。旧项目常把 autoload 写成相对路径(如 "psr-4": {"App\": "app/"}),但新版 Composer 对路径解析更严格,尤其当项目根目录不在 Web 服务器 DocumentRoot 下时,require_once 'vendor/autoload.php' 会找不到类。
- 检查
vendor/composer/autoload_static.php里生成的映射路径是否真实存在;若路径含../或空字符串,说明composer.json的autoload段配置和实际目录结构不匹配 - 运行
composer dump-autoload -o强制重生成优化后的自动加载器,比删 vendor 重装更快 - 别信 IDE 自动补全——它可能缓存了旧的类映射,重启 PHP 进程或清 IDE 缓存再试
真正麻烦的从来不是命令跑不起来,而是它跑完了却在 runtime 报错。旧项目迁移到新版 Composer,最易被忽略的是 platform 锁定、CA 证书、autoload 路径这三处隐性断点。


















