先看-vvv日志停在哪:Resolving dependencies是DNS或镜像问题,http/process-timeout无效;Downloading才调http.timeout;Executing command才调process-timeout;必须验证DNS、镜像配置、缓存清除及参数生效。

Composer 超时配置不生效,基本不是命令写错了,而是你改的参数根本没作用在卡住的那个环节上——http.timeout 对 Resolving dependencies 阶段完全无效,process-timeout 也救不了 DNS 解析失败。得先看日志停在哪一行,再动对应配置。
卡在 Resolving dependencies 是 DNS 或镜像没生效,不是 timeout 的事
这阶段 Composer 只查域名、读 packages.json 元数据索引,压根不发 HTTP 下载请求,所以 http.timeout、process-timeout 全部无效。
- 先验证 DNS:运行
dig packagist.org @114.114.114.114,若无响应或超时,说明本地 DNS 不可用;临时换 DNS(Linux/macOS 编辑/etc/resolv.conf加nameserver 8.8.8.8) - 检查镜像是否真生效:执行
composer config -g repo.packagist,输出必须是完整 JSON,例如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};若为空、false或含旧地址(如 phpcomposer.com),说明配置失败 - 注意项目级覆盖:项目根目录
composer.json中若有"repositories"字段(哪怕只是{}),全局镜像就失效;删掉整段再试 - Composer ≥ 2.2+ 必须用
repositories.packagist.org键名,旧写法repo.packagist已被弃用;验证命令应为composer config -g repositories.packagist.org
卡在 Downloading https:// 才该调 http.timeout
只有到这一步,Composer 才真正发起 HTTP 请求,http.timeout 才起作用。默认仅 60 秒,国内镜像首字节延迟高时极易触发 cURL error 28。
- 全局设置:
composer config -g http.timeout 600(单位秒,600 = 10 分钟) - 项目级更稳妥(尤其 CI):在
composer.json的"config"下加"http-timeout": 600 - 验证是否生效:运行
composer config -g http.timeout应输出600;若为空或报错,说明未写入成功 - 别碰
http-basic-timeout:这是 Composer v1 废弃项,v2 完全不读取 - PHP 的
default_socket_timeout若低于你设的http.timeout(常见值为 60),会提前掐断连接;查它:php -i | grep default_socket_timeout,必要时同步调高
卡在 Executing command 是子进程超时,process-timeout 才管用
比如 git clone、unzip、post-install-cmd 脚本执行卡住,http.timeout 完全不干预,必须靠 process-timeout 或环境变量。
-
process-timeout控制整个命令生命周期(含解压、钩子、autoload 生成),默认仅 300 秒;建议设为1800:composer config -g process-timeout 1800 - 环境变量优先级更高,尤其对插件启动的子进程:
COMPOSER_PROCESS_TIMEOUT=1800 composer install - 某些版本认
COMPOSER_PROCESS_TIMEOUT=0表示不限时,但慎用,避免无限挂起 - 若用代理,
https-proxy必须同时配置且协议头为http://(如http://127.0.0.1:7890),漏配或写成https://会导致 HTTPS 请求静默直连而卡住
缓存和配置写错是最常被忽略的“静默失效”点
配置命令看似成功,实际没生效,Composer 还在用旧缓存连官方源——这种问题不会报错,只会让你反复调 timeout 白等。
- 换源后必须清缓存:
composer clear-cache;但注意:它不清理~/.composer/cache/repo/https---packagist.org/下的元数据快照,需手动删:rm -rf ~/.composer/cache/repo/https---packagist.org/(Linux/macOS) - 镜像 URL 必须以
/结尾:https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(少斜杠会拼出非法路径) - 全局配置写错用户路径:用
sudo composer config -g会写进/root/.composer/config.json,但普通用户运行composer global require读的是$HOME/.composer/config.json - PHP 禁用
putenv()会导致composer config -g静默失败;检查php.ini中disable_functions是否含该函数
最麻烦的不是参数设多少,而是你根本不知道 Composer 此刻在等什么——-vvv 日志最后一行才是唯一可信线索,其他全是猜测。











