composer下载超时主因是默认超时策略(300秒总时长、60秒单次请求、仅2次重试)与国内网络不稳定(dns/tls/镜像拥塞)不匹配;需同步调高composer_network_timeout、http-timeout及retries,并验证镜像源是否真正生效。

Composer下载卡在“Operation timed out”或“Failed to download”
这不是你网络断了,而是 Composer 默认的超时策略和国内网络环境严重不匹配——它一边坚持连国外源,一边只给 300 秒总时间、60 秒单次请求,还默认重试仅 2 次。结果就是:包还没开始下,就报错退出。
- 典型现象:
The process timed out、cURL error 28: Operation timed out after 300000 milliseconds、反复出现retrying...后失败 - 根本原因不是“网慢”,是链路不稳定(DNS 解析卡顿、TLS 握手失败、镜像节点拥塞)+ Composer 双重超时限制共同触发
- 只调
process-timeout不够——它管不了 HTTP 连接本身;http-basic-timeout(Composer 2.2+)或http-timeout(旧版别名)必须同步设高 - 临时救急命令:
COMPOSER_NETWORK_TIMEOUT=300 composer install --retries=5(注意:环境变量 + 命令行参数组合才稳)
换镜像源但依然超时,怎么确认是否真生效
很多人执行了 composer config -g repo.packagist ... 就以为搞定了,其实镜像可能根本没走通——比如 DNS 解析失败、被代理劫持、或配置被项目级 repositories 覆盖。
- 验证是否生效:
composer config -g repos.packagist输出应为{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"},而不是packagist.org - 手动测镜像可用性:
curl -I https://mirrors.aliyun.com/composer/packages.json,看能否秒回HTTP/2 200;如果超时或返回 404,说明问题出在本地网络,不是 Composer 配置 - 常见干扰项:Windows 系统代理“自动检测设置”、macOS 的 PAC 脚本、杀毒软件 HTTPS 扫描、公司防火墙拦截长连接——这些都会让请求卡死在 TLS 握手阶段
- 企业网必备:
export HTTPS_PROXY=http://your-proxy:8080(只设HTTP_PROXY没用,Composer 默认全走 HTTPS)
CI/CD 中 Composer install 反复失败怎么办
CI 环境比本地更脆弱:每次都是干净容器、无缓存、DNS 策略严、内存受限,而 Composer 默认配置完全没考虑这点。
- 必须开启缓存:
cache: $HOME/.composer/cache(GitHub Actions)或对应 GitLab CI 配置,否则每次重下百 MB zip 包是常态 - 强制走 dist 包:
--prefer-dist跳过 git clone,避免触发 GitHub API 限流(尤其没配github-oauth时) - 关掉非必要环节:
--no-interaction --no-progress --no-scripts,防止php artisan key:generate这类钩子在无交互环境下卡住 - 全局配置兜底(写进 CI 脚本开头):
composer config -g process-timeout 3000 && composer config -g http-timeout 600 - 注意:GitHub Actions 单 job 默认超时 600 秒,若 Composer 自身设了
process-timeout低于该值,会提前中断——建议设为 2700(45 分钟)并配合--retries=3
调高 timeout 后仍失败,下一步排查什么
超时只是表象,背后可能是更底层的通信阻断。这时候不能继续加时间,得看请求到底卡在哪一层。
- 加
-vvv查日志:composer install -vvv,重点看最后一行是卡在GET https://.../packages.json(元数据拉不到),还是某个https://.../vendor.zip(具体包下载失败) - 如果是前者:基本是 DNS 或 TLS 问题,换 DNS(如
8.8.8.8)、临时禁用secure-http(composer config -g secure-http false,仅内网可信环境) - 如果是后者:说明镜像源本身响应慢或带宽不足,可尝试切换镜像(阿里云 → 清华 → 华为云),或绑定 hosts(
123.56.123.45 mirrors.aliyun.com)绕过 DNS 污染 - 极少数情况:PHP 的
allow_url_fopen被禁用,或 OpenSSL 扩展未启用(php -m | grep openssl确认)
真正麻烦的从来不是 timeout 数值本身,而是你不知道请求压根没发出去——先确认链路通不通,再谈等多久。










