composer全局换源未生效的根本原因是键名版本不匹配(1.x用repo.packagist,2.2+需用repositories.packagist.org)、项目级配置覆盖全局、未清缓存及环境变量路径错误。

composer config -g repo.packagist 为什么没生效
这是最常被卡住的地方:命令看似执行成功,但 composer install 还是慢、还是走 packagist.org。根本原因不是命令写错,而是 Composer 配置优先级和键名版本不匹配。
-
repo.packagist是 Composer 1.x 的写法,2.2+ 版本推荐用repositories.packagist.org;如果用旧键名,部分新版会静默忽略 - 全局配置(
-g)会被项目级composer.json中的repositories字段完全覆盖——哪怕你只是加了一行空配置 - Windows 下用 Git Bash 时,
COMPOSER_HOME环境变量可能未生效,实际读取的是%APPDATA%\Composer\config.json,而不是你以为的~/.composer/config.json - 执行命令后没清缓存:
composer clear-cache必须做,否则元数据仍从旧源加载
怎么安全地全局换源(阿里云/腾讯云二选一)
别猜路径、别手动改 JSON,用命令直接写入且确保键名兼容。两个主流镜像都稳定,区别在于 fallback 行为:腾讯云默认开启回源(找不到包时自动试官方源),阿里云默认关闭——如果你常装新发布或小众包,腾讯云更省心。
- 设阿里云源(兼容性优先):
composer config -g repositories.packagist.org '{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}' - 设腾讯云源(容错性优先):
composer config -g repositories.packagist.org '{"type": "composer", "url": "https://mirrors.cloud.tencent.com/composer/"}' - URL 结尾必须带
/,否则 Composer 2.5+ 会报Invalid repository type - 验证是否写入成功:
composer config -g repositories.packagist.org,输出应为完整 JSON 对象,不是空或报错
临时切源不改配置的三种场景
有些情况你根本不想动全局设置,比如 CI 脚本、帮同事调试、或只跑一次 create-project。这时候硬编码配置反而容易污染环境。
- 单次命令指定源:
composer create-project laravel/laravel myapp -r https://mirrors.aliyun.com/composer/ - 仅当前项目生效(不写进
composer.json):composer config repo.packagist composer https://mirrors.ustc.edu.cn/composer/(注意:这是项目级,无-g) - CI 流水线推荐腾讯云源:
https://mirrors.cloud.tencent.com/composer/,fallback 更友好,避免因镜像同步延迟导致构建失败
换源后仍然 404 或 cURL error 60 怎么办
不是镜像挂了,大概率是网络或证书链问题。国内镜像基本都 HTTPS 全站,但某些企业网络或老旧系统会拦截中间证书。
-
cURL error 60: SSL certificate problem:先试curl -I https://mirrors.aliyun.com/composer/,若失败,说明本地 CA 证书过期,可临时关校验(不推荐):export COMPOSER_DISABLE_TLS=1,或更新 ca-certificates 包 -
Could not fetch https://mirrors.cloud.tencent.com/composer/p2/...:常见于 DNS 污染,换 DNS(如 114.114.114.114)或直接 ping 域名确认连通性 - 已停用镜像别再试:
phpcomposer.com和packagist.phpcomposer.com已下线,继续用会返回 404 或证书错误
最易被忽略的一点:换源命令执行完,一定要立刻 composer clear-cache,然后新建一个空目录,跑一次 composer require monolog/monolog 看下载地址——别信“应该生效了”,得亲眼看到域名才作数。










