如何解决Composer因网络问题导致的 “Failed to download” 错误? (超时与重试配置)

9次阅读

根本原因是网络环境导致下载失败且默认重试策略过弱;应通过环境变量composer_NETWORK_TIMEOUT和–retries参数调高超时与重试次数,并配合国内镜像源及清缓存解决。

如何解决Composer因网络问题导致的 “Failed to download” 错误? (超时与重试配置)ailed to download”?

根本原因不是 Composer 本身出错,而是它默认用系统级的 curlphp_stream 下载包时,受本地网络环境(如 dns 污染、连接超时、TLS 握手失败)影响,且默认重试策略极弱——只重试 3 次,每次超时仅 30 秒,对国内或高延迟网络几乎无效。

composer.jsonconfig 不起作用?

很多人误以为改项目根目录下的 composer.json 就能调全局下载行为,其实不行。config 里只能控制包安装路径、平台配置等,超时和重试必须通过全局配置或命令行参数生效。正确做法是:

  • 运行 composer config -g repo.packagist composer https://packagist.phpcomposer.com(已失效,不推荐)或切换为国内镜像源(见下条)
  • composer config -g github-oauth.github.com "your_token" 解决 GitHub API 限速(若报 403)
  • 但最关键的超时与重试,得靠环境变量或命令行参数

真正有效的超时与重试设置(命令行 + 环境变量)

Composer 从 2.2 开始支持 COMPOSER_PROCESS_TIMEOUTCOMPOSER_NETWORK_TIMEOUT,但注意:COMPOSER_NETWORK_TIMEOUT 控制的是单次 HTTP 请求超时(单位秒),而 COMPOSER_PROCESS_TIMEOUT 是整个命令最长运行时间(含解压、脚本执行等),别混用。

实操建议:

  • 临时提高单次请求超时:在命令前加 COMPOSER_NETWORK_TIMEOUT=300
  • 强制增加重试次数:加 --retries=5(Composer 2.2+ 支持,低于此版本无效)
  • 组合使用最稳:
    COMPOSER_NETWORK_TIMEOUT=300 composer install --retries=5
  • 若仍失败,说明是 DNS 或中间代理问题,需配合镜像源 —— 推荐清华源:
    composer config -g repo.packagist https://packagist.phpcomposer.com

    (旧)或更可靠的:

    composer config -g repo.packagist https://packagist.org

    + 使用 https://mirrors.tuna.tsinghua.edu.cn/composer/ 镜像(需额外配置)

镜像源配置后还要手动改 composer.json 吗?

不用。全局镜像源配置会自动覆盖所有项目的源地址,除非项目里显式写了 "repositories"。但要注意一个坑:composer create-project 初始化时如果网络卡住,它会缓存失败状态,此时要清空 Composer 的下载缓存:

composer clear-cache

,否则即使换了镜像、调了超时,也会复现 “Failed to download”。

另外,某些企业网络会拦截 HTTPS SNI 或屏蔽 api.github.com,这时即使超时设再大也没用 —— 必须联系运维放行,或改用 ssh 方式克隆(需提前配置 git@github.com 的 SSH key 并在 composer.json 中把 vcs 类型仓库写成 git@github.com:user/repo.git)。

text=ZqhQzanResources