卡在Resolving dependencies是DNS或镜像未生效,需先dig验证DNS、再检查composer config -g repo.packagist是否输出正确JSON;卡在Downloading才调http.timeout;卡在Executing command则属process-timeout或Git层问题。

Composer 超时不是单一参数能解决的问题,它分层生效、互不覆盖——卡在哪儿,就得调哪一层的参数,否则只是延长失败时间。
卡在 Resolving dependencies 是 DNS 或镜像没生效
这阶段根本没发 HTTP 请求,http.timeout 和 process-timeout 完全无效。Composer 只做域名解析和读取 packages.json 元数据索引。
- 先验证 DNS:运行
dig packagist.org @114.114.114.114,若超时或无响应,说明本地 DNS 不可用 - 检查镜像是否真生效:
composer config -g repo.packagist输出必须是完整 JSON,例如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};漏掉composer类型参数、少末尾斜杠/、键名写成repos.packagist都会导致静默失效 - 项目级
repositories字段会覆盖全局镜像,哪怕只写了个空对象{},也会让全局配置失效
卡在 Downloading https:// 才该动 http.timeout
此时 Composer 正在下载元数据或 ZIP 包,http.timeout 控制单次请求总耗时(含 DNS、TLS 握手、首字节等待、body 传输),默认仅 60 秒,国内镜像首字节延迟高时极易触发 cURL error 28。
- 全局设置:
composer config -g http.timeout 600(单位秒) - 项目级更稳妥(尤其 CI):
"config": {"http-timeout": 600}写进composer.json - 注意:
php -i | grep default_socket_timeout查出的值若低于你设的http.timeout(常见为 60),PHP 层会提前掐断连接,必须同步调高 -
http-basic-timeout是 v1 废弃项,v2 完全不读取,写了也白写
卡在 Executing command 或 Cloning into 是 process-timeout 或 Git 层问题
process-timeout 控制整个命令生命周期(含 git clone、解压、钩子执行等),默认 300 秒。但要注意:Cloning into 卡住本质是 Git 命令阻塞,Composer 只是调用它——改 process-timeout 只是延长等待,不解决根本原因。
- 先手动复现:
git clone https://github.com/myorg/private-lib.git /tmp/test,看是否同样卡住 - 若走 SSH:
ssh -T git@github.com测试连通性;不通则加GIT_SSH_COMMAND="ssh -o ConnectTimeout=10" - 若走 HTTPS:确认已配 Token:
composer config --global github-oauth.github.com <token></token>,且仓库 URL 是https://开头,不是git@ - 公司用 HTTP 代理?Git 必须单独配:
git config --global http.proxy http://proxy.example.com:8080,否则 Composer 调的git不走代理
代理配置必须同时设 http-proxy 和 https-proxy
Composer 对 HTTP 和 HTTPS 请求走两套独立路由,所有包源(Packagist、GitHub、GitLab)均走 HTTPS,只配 http-proxy 会导致 HTTPS 请求静默直连,结果就是卡在 Loading composer repositories 或反复报 cURL error 28。
-
https-proxy的值协议头必须是http://,哪怕代理服务监听 HTTPS 端口,例如:http://127.0.0.1:7890 - 密码含
@或/必须 URL 编码,例如:http://user:pa%40ss%2Fword@127.0.0.1:8080 - 验证是否生效:
composer config -g --list | grep -E "(http|https)-proxy",必须看到两行且格式合规 - NTLM 代理(如 Windows 域环境)需用
cntlm或px中转,Composer 原生不支持
最常被忽略的是:私有仓库走 Git 时,每次 git checkout 都计入 process-timeout 总耗时,不是单次独立计时;而 http.timeout 对 git clone 完全无效。分不清卡点就乱调参数,只会掩盖真实瓶颈。


















