默认直连 packagist.org 必然失败,因其无国内 cdn 节点,dns 解析指向海外 ip,tls 握手频繁超时且无重试机制,实测 curl -i https://packagist.org/packages.json 在多数国内环境卡顿或失败。

不换镜像源,composer install 卡在 Loading composer repositories 是常态,不是你网络差,是 packagist.org 对国内用户根本不可达。
为什么默认直连 packagist.org 必然失败
packagist.org 没有面向中国用户的 CDN 节点,DNS 解析常指向海外 IP,TLS 握手在中间链路频繁超时,且无重试机制。实测中,curl -I https://packagist.org/packages.json 在多数国内环境会卡 10 秒以上或直接失败——这不是 Composer 的 bug,是物理网络限制。
- 镜像源(如阿里云)把元数据和 dist 包缓存到国内节点,请求走 BGP 直连,
curl -I https://mirrors.aliyun.com/composer/packages.json通常毫秒级返回 200 - 镜像只代理
type: "composer"的源,对git@或https://github.com/xxx类 VCS 包无效,别指望它加速私有仓库 - Composer 2.0+ 默认拒绝 HTTP 协议,URL 必须是 HTTPS 且末尾带
/,否则composer config -g repo.packagist静默失效
镜像配置写错一个字符就等于没配
composer config -g 命令对键名、类型、协议极其敏感,错一个条件,配置就白写:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 键名必须是
repo.packagist(不是repos.packagist,多一个s就失效) - type 值必须显式写
composer(漏掉这个参数,旧版 fallback 到官方源,新版直接忽略) - URL 必须是 HTTPS 且末尾有
/(http://或https://mirrors.aliyun.com/composer不带斜杠,均被拒绝) - 验证是否生效:运行
composer config -g repo.packagist,输出必须是完整 JSON,例如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}
换了镜像还是卡?大概率是 DNS 缓存或 IPv6 fallback
即使 composer config -g repo.packagist 显示正确,composer install 仍卡在 Loading composer repositories,常见原因不是镜像问题,而是底层网络栈行为:
- cURL 复用系统 DNS 缓存,
mirrors.aliyun.com可能仍被解析成海外 IP;加COMPOSER_NO_INTERACTION=1并配合-vvv查日志,看实际连接的是哪个 IP - Linux/macOS 默认优先走 IPv6(AAAA 记录),但国内镜像站普遍 IPv6 支持不全,会卡几秒后 fallback 到 IPv4;唯一有效解法是加环境变量
COMPOSER_IPV4=1 - Docker 构建中,必须在
Dockerfile里提前执行镜像配置命令,否则每次构建都重新走海外解析
parallel-downloads 不是设得越高越好
并发下载能提速,但依赖 Composer 版本和本地资源:
- 只有 Composer 2.2+ 支持
parallel-downloads,1.x 完全无视该配置;先确认版本:composer --version - 默认值是 3,建议设为
10或15;设成20容易触发file_put_contents(/tmp/): failed to open stream - 企业内网或低配 CI 环境,
6–8更稳;已装过hirak/prestissimo的必须卸载:composer global remove hirak/prestissimo,它在 2.x 中已失效且可能降级为单线程
最常被忽略的点:项目级 composer.json 中硬编码的 repositories 字段,优先级高于全局镜像配置;哪怕全局配对了,只要项目里写了 "packagist.org" 或下线的私有源,Composer 就会逐个尝试并超时重试——清理冗余项比调参数更关键。










