答案是网络异常90%源于dns解析、tcp连接或tls握手失败,应先用curl -i命令定位根因:返回unknown host说明dns失败需换dns,卡住或403/502则为网关拦截或url错误(如缺末尾斜杠)。

网络异常导致的 composer install 报错,90% 不是 Composer 本身坏了,而是请求在 DNS、TCP 或 TLS 阶段就断了——别急着删 vendor 或重装 PHP,先确认「到底卡在哪一层」。
curl -I 是第一诊断命令
Composer 不输出 HTTP 状态码,但 curl -I 能直接暴露网关拦截、镜像失效或 URL 拼写错误:
- 运行
curl -I https://mirrors.aliyun.com/composer/:必须秒回HTTP/2 200或HTTP/1.1 200;返回403、502或卡住,说明网关策略已拦截该路径 - 若报
unknown host,是 DNS 污染,不是 Composer 配错了——换 DNS(如8.8.8.8)比调http-timeout有效十倍 - URL 必须带末尾斜杠:
https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(少斜杠会拼成/composerpackages.json导致 404)
镜像配置必须满足三要素
Composer 2.x 对镜像字段极其敏感,缺一不可,否则静默回退到 packagist.org(国内多数返回 403,被误判为“未授权”):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 键名必须是
repo.packagist(单数、小写、无s,不是repos.packagist) -
type字段必须显式设为"composer"(不能省略,也不能写成"composer-type") -
url必须是 HTTPS 且末尾带/,例如"https://mirrors.aliyun.com/composer/" - 验证方式:
composer config -g repo.packagist,输出应为完整 JSON 对象或纯字符串 URL;若为空、null或仍是https://repo.packagist.org,说明配置根本没生效
缓存和 lock 文件会硬编码旧源地址
composer.lock 里每个包都存了 provider 的完整 URL(比如 https://repo.packagist.org/p2/monolog/monolog.json),换镜像后它仍会优先重试这些地址:
- 删掉
vendor/和composer.lock(开发环境可操作) - 必须执行
composer clear-cache;Windows 用户还得手动删%LOCALAPPDATA%\Composer\cache - 加
--no-cache强制跳过所有本地缓存:composer install --no-cache - 临时覆盖源更安全:
composer install -vvv --repository=https://mirrors.aliyun.com/composer/
超时参数要分清楚作用域
--timeout=300 只延长整个命令生命周期,对单个 HTTP 请求无效;而 provider-*.json 下载失败本质是单请求超时:
- 必须设全局 HTTP 超时:
composer config -g http-timeout 600 - 验证是否生效:
composer config -g http-timeout输出应为600,不是空或默认的300 - Git 克隆超时需单独配:
git config --global core.sshCommand "ssh -o ConnectTimeout=30" - 若
vendor/autoload.php存在但运行时报Class not found,大概率是部分 provider 下载失败后 Composer 静默跳过——此时重装前务必先调高http-timeout
真正难处理的,是企业网关劫持 DNS 或复用 TCP 连接导致的 Connection reset by peer,这时改镜像、清缓存都没用,得用 --resolve 或 --no-keepalive 强制走干净链路——但这一步,很多人连 curl -I 都没跑完就去重装 Composer 了。










