答案是执行composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/并清缓存,需严格满足四要素:键名repo.packagist(非repos)、中间type值composer、url以https开头且末尾带斜杠、必须加-g参数,否则静默失效。

composer 下载慢在 macOS 上不是网络差,是默认直连 packagist.org——物理距离远、TLS 握手慢、没 CDN 缓存,卡在 Downloading 或反复重试很常见。换国内镜像源是最直接有效的解法,不用改 /etc/hosts、不装代理、不折腾全局加速工具。
怎么全局换阿里云镜像(macOS 推荐)
执行一条命令即可,所有项目自动生效:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
注意这四个硬性条件,缺一就会静默失效:
-
repo.packagist不能写成repos.packagist(多一个s就被忽略) - 中间的
composer是type值,不可省略或替换成https等其他字符串 - URL 必须以
https://开头,且末尾带斜杠/(https://mirrors.aliyun.com/composer/✅,少斜杠会 404) - 必须加
-g,否则只改当前目录下的composer.json,换项目就回退
验证是否写入成功:
composer config -g repo.packagist
输出应为 {"type":"composer","url":"https://mirrors.aliyun.com/composer/"} 或类似完整 URL 字符串。如果返回空、null、或提示 Key "repo.packagist" does not exist,说明命令根本没生效。
为什么换了镜像还是卡在 Loading repositories?
最常被忽略的一步:composer clear-cache 没执行。缓存里还存着旧的 packages.json 和元数据,Composer 会优先读缓存,哪怕源已改,它仍试图从 packagist.org 拉取校验信息,结果就是卡在 DNS 解析或 TLS 握手。
其他可能性:
- 项目根目录下
composer.json里写了"repositories"字段,覆盖了全局配置(优先级更高);可用composer config --list和composer config --list --global对比确认实际生效的是哪个 - 用了过时插件如
hirak/prestissimo,它在Composer 2.2+中不仅无效,还会干扰并行下载 - macOS 上 curl 或 OpenSSL 版本太老,导致 HTTPS 连接失败;可运行
composer diagnose查具体报错
怎么验证真从国内拉取?
别信感觉,看日志:
composer install -vvv
最后几行出现类似:
Reading packages.json from cache at /Users/xxx/.composer/cache/repo/https---mirrors-aliyun-com-composer/packages.json
才算真正生效。如果日志里还出现 https://packagist.org/packages.json,说明 fallback 了,配置没起作用。
额外注意:
- 阿里云镜像是目前最稳定的全量同步源,每日更新,支持 HTTP/2;清华、腾讯、华为源也可用,但路径格式略有差异,比如华为源地址是
https://mirrors.huaweicloud.com/repository/php,不是/composer/ - macOS 上若提示
Warning: putenv() has been disabled,需检查php.ini的disable_functions,删掉putenv和proc_open,然后重启 PHP-FPM 或 Apache
临时换源只对当次命令有效(适合调试)
比如快速验证某个包能否装上,不改任何配置:
composer require guzzlehttp/guzzle --repository=https://mirrors.aliyun.com/composer/
注意:--repository 只影响本次命令的包解析,composer install 或 composer update 不会继承该设置。若想看到真实请求路径,必须加 -vvv 参数配合使用。
这个参数优先级最高,但容易误以为“换源成功了”,其实只是单次覆盖,下次命令就恢复原状。
关键点在于:镜像源本身没问题,问题几乎都出在配置写错、缓存没清、或项目级配置意外覆盖。macOS 用户尤其要注意~/.composer/config.json 路径是否被自定义过,以及系统级 curl/SSL 环境是否异常。











