Composer 2.5+ 报“invalid package information”是因强制校验provider-*.json哈希,旧镜像不支持透传或重签所致;阿里云默认启用透传,腾讯云需手动开启verify-signature,清华镜像须用完整URL且避免错误type写法。

Composer 2.5+ 镜像报 invalid package information 怎么办
这不是网络问题,是协议升级导致旧镜像直接失效。Composer 2.5+ 强制校验 provider-*.json 文件的 sha256 哈希值,而早期镜像(如硬替换 URL 的 phpcomposer.com)不透传或重签哈希,就会触发 Invalid package information 错误。
- 阿里云镜像自 2025 年 Q3 起默认启用哈希透传,无需额外操作
- 腾讯云需手动开启:运行
composer config -g repos.packagist.options.verify-signature true - 清华镜像(
https://mirrors.tuna.tsinghua.edu.cn/composer/)已支持透传,但必须用完整 URL,不能漏掉/composer/后缀 - 错误写法:
composer config -g repos.packagist packagist https://mirrors.tuna.tsinghua.edu.cn/composer/—— 这种把packagist当作 repo type 会跳过签名检查,后续require某些包时突然失败
CI 中 composer config -g 镜像配置总失效
CI 环境复用缓存或基础镜像,composer config -g 写入的是全局配置(~/.composer/config.json),前序 job 写入的旧配置会被继承,且无提示。
- 安全做法:每次构建前先清除,执行
composer config -g --unset repos.packagist - 再显式设置:例如
composer config -g repos.packagist https://mirrors.aliyun.com/composer/ - 更推荐方式:用
-d参数临时指定,比如composer -d /tmp/composer install,配合构建参数注入镜像 URL,避免污染全局状态 - 注意:Windows 下 PowerShell 可能因执行策略拦截命令,改用 CMD 或先运行
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
镜像源配置是否生效?用这三步验证
别信 composer diagnose,它根本不检测镜像连通性。真正有效的验证路径是:
- 查实际生效源:
composer config -g repo.packagist,输出必须是完整 HTTPS URL 且末尾带斜杠(如https://mirrors.aliyun.com/composer/);空、https://packagist.org或报错说明没生效 - 看真实请求地址:运行
composer install -vvv --no-progress 2>&1 | head -n 20,第一行应为Downloading https://mirrors.aliyun.com/...;若出现packagist.org,说明镜像未生效或被项目级repositories覆盖 - 直连测试镜像端点:
curl -I https://mirrors.aliyun.com/composer/packages.json,返回HTTP/2 200才算通;404说明 URL 错(如华为云地址是/repository/php/,不是/composer/);超时则是 DNS 或网络问题
换了镜像,PHP 8 升级后依赖还是解析失败
镜像只是下载通道,不参与 PHP 版本兼容判断。真正卡住你的是 config.platform.php 错配、缓存污染或扩展未加载。
- 先确认真实 PHP 版本:
php -v,注意 Docker、CI runner、asdf/shim 可能加载不同版本 - 检查平台伪装:
composer config --list | grep platform,若输出platform.php : 7.4.33,说明 Composer 正在假装跑在 PHP 7.4 上,哪怕你本地是 8.2 —— 这会让镜像返回的 PHP 8 兼容包被过滤掉 - 验证扩展是否真启用:
php -m | grep redis,镜像再快也解决不了extension_loaded('redis')返回false的问题 - 换源后务必清缓存:
composer clear-cache,否则旧缓存里的packages.json元数据仍指向境外地址


















