正确命令是 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,键名必须为单数 repo.packagist 且含 type 参数,url 必须以 https:// 开头并以 / 结尾,否则静默失效或 404。

必须用 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,且 URL 末尾带斜杠,再清缓存——其他写法大概率静默失效。
为什么 composer config -g repos.packagist.org.url 不管用
这个命令本身是错的:键名 repos.packagist.org 是旧版 Composer 1.x 的写法,新版(2.0+)已废弃;正确键名是单数 repo.packagist,且中间必须带 composer 这个 type 参数。漏掉它,Composer 诊断会报 Repo is not configured properly,但不提示你——它直接 fallback 到 https://packagist.org。
-
repos.packagist(多一个 s)→ 静默忽略,配置不生效 -
repositories.packagist.org→ 键名不存在,等同于没配 -
composer config -g repo.packagist https://mirrors.aliyun.com/composer(缺composertype)→ 写入无效结构,composer diagnose明确报错 - 验证方式只有一种:
composer config -g repo.packagist,输出必须是完整 JSON,如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}
https://mirrors.aliyun.com/composer 缺斜杠就 404
URL 必须以 https:// 开头,且末尾带 /。少这个斜杠,Composer 会把请求拼成 https://mirrors.aliyun.com/composer/packages.json,而实际路径是 https://mirrors.aliyun.com/composer//packages.json(镜像站自动补),但部分 CDN 或代理会拒绝这种双斜杠,返回 404 或空响应。
- ✅ 正确:
https://mirrors.aliyun.com/composer/ - ❌ 错误:
https://mirrors.aliyun.com/composer、https://mirrors.aliyun.com/composer//、http://(强制 HTTPS) - 清华源同理:
https://mirrors.tuna.tsinghua.edu.cn/composer/,别漏斜杠 - 别用已停服地址:
https://packagist.phpcomposer.com(2023 年下线)
换源后还是超时?先看流量有没有真走镜像
缓存不清理、项目级配置覆盖、DNS/TLS 卡住,都会让镜像形同虚设。不能只看命令执行成功,得验证真实请求路径。
- 运行
composer install -vvv | grep -i "mirrors.aliyun",没输出说明还在直连海外 - 执行
composer clear-cache,否则旧缓存(尤其是https---packagist.org目录)仍会触发失败请求 - 检查项目根目录
composer.json是否含"repositories"字段——它优先级高于全局配置,会覆盖repo.packagist - CI 环境务必设
COMPOSER_IPV4=1,IPv6 在国内多数镜像站支持不全,隐性拖慢甚至失败
http.timeout 和 process-timeout 别混用
这两个参数解决完全不同的卡点,设错等于白调。
-
http.timeout控制单次 HTTP 请求总耗时(DNS + TCP + TLS + 响应头),对应cURL error 28或Could not fetch https://...类错误;建议设为600 -
process-timeout控制整个命令生命周期(依赖解析、下载、解压、脚本执行),对应卡在Generating autoload files后长时间无响应;建议设为1200 -
process-timeout超过7200秒会被 Composer 硬编码截断回300,设再大也没用 - CI 脚本开头必须显式设
export COMPOSER_HOME=/tmp/composer,否则每次容器重启都丢全局配置
最容易被忽略的是:镜像只加速下载,不解决 Resolving dependencies 卡顿——那是 SAT 求解器在本地做版本回溯,和网络无关。如果卡在这一步,该收紧 require 版本约束,而不是换镜像或调 timeout。











