配了镜像仍卡在downloading,是因为repo.packagist键名错误、type参数缺失或url末尾缺斜杠,任一出错composer就静默回退至packagist.org;需严格按格式配置并验证实际请求域名。

为什么配了镜像还是卡在Downloading
不是镜像没用,是根本没走镜像——repo.packagist 写错、composer type 缺失、URL 少斜杠,三者任一出错,Composer 就自动 fallback 到 https://packagist.org,但不报错,只默默变慢。
常见现象:执行 composer install 卡在 Downloading,Ctrl+C 中断后重试仍卡;composer config -g repo.packagist 输出为空或仍是 https://packagist.org。
-
repo.packagist不能写成repos.packagist(多一个 s,键名无效) - 命令中必须显式带
composer这个 type 值:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - URL 必须是 HTTPS + 末尾带
/:https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(路径拼接会 404)
全局配置 vs 项目级配置:谁更靠谱
全局配置省事,但 CI/CD、Docker、宝塔里容易失效;项目级配置写进 composer.json,拉代码即生效,行为可预测。
典型失效场景:CI 流水线用 root 用户配了全局镜像,但构建容器以 www-data 用户运行,读不到 ~/.config/composer/config.json;宝塔面板默认用 www 用户执行命令,sudo composer config -g 配的是 root 的配置,它根本不用。
- 团队协作或 CI 环境,优先用项目级:
composer config repo.packagist composer https://mirrors.aliyun.com/composer/(去掉-g,在项目根目录执行) - 该命令会安全追加到
composer.json的repositories字段,不覆盖已有私有源 - 如果项目已有
"repositories": {},空对象也会屏蔽全局镜像,必须删掉或改成合法结构
换源后 composer install 报 hash 不匹配怎么办
镜像只加速下载,不改变包内容,但元数据同步有延迟或本地缓存残留。旧 composer.lock 记录的是官方源的哈希值,和镜像返回的元数据对不上。
直接删 vendor/ 和 composer.lock,再跑 composer install——别试图保留 lock 文件,也别手动改哈希。
- 删完后首次安装会重新解析依赖图并生成新
composer.lock,耗时略长,但后续稳定 - 若仍报错,加
--no-cache强制跳过本地缓存:composer install --no-cache - 确认是否真走镜像:开终端抓包或看下载日志里域名是不是
mirrors.aliyun.com,别信“命令没报错”
并发下载没开,镜像再快也白搭
Composer 2.2+ 支持 parallel-downloads,默认只开 3 个并发线程。千兆带宽下只跑几十 KB/s,本质是人为限速。
不开并发,换阿里云、腾讯云、华为云任何镜像,速度都卡在瓶颈上;开了之后,Laravel 全量依赖从 3 分钟压到 15 秒内是常态。
- 全局启用:
composer config -g parallel-downloads 8(8 是推荐值,设 10 容易触发临时文件竞争) - 该设置仅对
composer install生效;composer update仍需串行解析依赖图,无法靠并发提速 - 华为云镜像地址特殊:
https://mirrors.huaweicloud.com/repository/php/composer/,注意路径含/repository/php/composer/,结尾必须有/











