Composer下载超时主因是process-timeout(默认300秒)和http-basic-timeout(默认60秒)过短,二者必须同步调高;改composer.json中不存在的"timeout"字段无效,正确配置需用composer config -g process-timeout 1800与http-basic-timeout 300,并配合阿里云或中科大镜像源。

Composer 下载超时不是网络慢,而是默认的 process-timeout(300 秒)太短,且 http-basic-timeout(60 秒)也常被忽略——两者必须同时调高才有效。
为什么改 composer.json 里的 timeout 没用
很多人在 composer.json 的 config 块里写 "timeout": 600,但完全不生效。因为这个字段根本不存在于 Composer 配置规范中;真正起作用的是两个独立配置项:process-timeout 和 http-basic-timeout,它们都不支持通过 composer.json 设置(除非是项目级 config,但也不推荐)。
常见错误现象:执行 composer update 卡在 Downloading https://mirrors.aliyun.com/... 后直接中断,报错类似 The process timed out 或 failed to open stream: Connection timed out。
关键区别:
-
process-timeout控制整个外部命令生命周期(比如git clone、unzip),默认 300 秒 -
http-basic-timeout控制单次 HTTP 请求的连接+读取时限,默认仅 60 秒,影响 ZIP 包下载 - 只调高其中一个,另一层仍会提前掐断流程
永久生效:全局配置 process-timeout 和 http-basic-timeout
运行以下两条命令即可写入全局配置(路径为 ~/.composer/config.json):
composer config -g process-timeout 1800 composer config -g http-basic-timeout 300
说明:
-
1800是 30 分钟,适合国内多数弱网或大包场景;调试时可先设为600确认流程能走通 -
http-basic-timeout 300要求 Composer ≥ 2.2;旧版本只能靠换源或临时参数硬扛 - 设为
0表示不限时,但可能卡死无响应,不建议 - 改完无需重启终端,下次命令自动读取
必须配合国内镜像源,否则调 timeout 只是“等得更久”
单纯延长超时时间治标不治本。当前(2026 年)可用的稳定国内镜像只剩两个:
- 阿里云:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 中科大:
composer config -g repo.packagist composer https://mirrors.ustc.edu.cn/composer/
注意:
-
https://packagist.phpcomposer.com已于 2022 年下线,勿再使用 - 换源后仍可能超时?那大概率是遇到
"type": "git"的包——它会绕过镜像直连 GitHub,此时必须额外配 Git 超时或强制 HTTPS 克隆 - 验证是否生效:运行
composer config -g repo.packagist,应输出对应 URL
Git 类包卡住时,process-timeout 才真正起作用
当依赖里有开发版包(如 "monolog/monolog": "dev-main"),Composer 会调用系统 git clone,而该命令默认无超时。一旦卡在 DNS 解析或 TCP 握手,就会无限等待,直到被 process-timeout 强制终止。
解决办法:
- 强制走 HTTPS(避开 SSH 认证失败):
composer config -g github-protocols https - 给 Git 加超时(Linux/macOS):
git config --global core.sshCommand "timeout 300 ssh" - 若需代理,确保
http.proxy和https.proxy已配好,否则 Git 无法穿透 - 避免
--prefer-source:它强制克隆,比--prefer-dist更容易卡死
最易被忽略的一点:很多用户只调了 process-timeout,却没意识到 http-basic-timeout 在 ZIP 下载阶段早已悄悄超时——尤其在下载 laravel/framework 这类带完整测试套件的 dist 包时,60 秒远远不够。


















