永久生效需分别配置:http-timeout管下载(如composer config --global http-timeout 600),process-timeout管执行(新版须用环境变量composer_process_timeout=1800),二者独立且不可互替,项目级配置更稳妥。

永久生效必须分清 http-timeout 和 process-timeout
Composer 超时不是单一参数控制的,http-timeout 管下载(如拉取 packages.json、解压 ZIP),process-timeout 管执行(如 git clone、post-install-cmd 脚本)。设错地方,永久配置也白搭。
常见错误现象:改了 process-timeout 却卡在 Downloading https://...;或设了全局 http-timeout,但安装时仍报 The process timed out —— 这说明两个超时都得调,且不能互相替代。
-
http-timeout全局生效命令:composer config --global http-timeout 600 -
process-timeout全局已废弃composer config --global process-timeout,新版 Composer 不认这个写法 - 真正有效的全局
process-timeout是环境变量:export COMPOSER_PROCESS_TIMEOUT=1800(Linux/macOS)或 Windows 系统变量中设COMPOSER_PROCESS_TIMEOUT=1800 - 项目级更稳妥:直接在
composer.json的"config"段里写"http-timeout": 600和"process-timeout": 1800
为什么 composer config -g process-timeout 有时不生效
这不是你操作错了,是 Composer 自身行为变更。2.2+ 版本起,--global 方式设置 process-timeout 已被移除逻辑支持,命令能执行成功,但实际读取时被忽略 —— 日志里不会报错,只会静默失效。
验证方式很简单:运行 composer config -g --list | grep process-timeout,如果输出为空或没显示值,说明没生效;再执行 echo $COMPOSER_PROCESS_TIMEOUT(Linux/macOS)看环境变量是否已设。
- CI/CD 中务必用环境变量,比如 GitHub Actions 的
env:块里加COMPOSER_PROCESS_TIMEOUT: 1800 - Docker 构建时,在
RUN步骤前先export COMPOSER_PROCESS_TIMEOUT=1800,比后期补配置可靠 - 某些基础镜像(如
php:8.3-cli)自带旧版 Composer 配置缓存,建议构建前先composer clear-cache
设多大才合理?别踩 7200 秒这个硬限制
Composer 对 process-timeout 值有硬编码上限:超过 7200(2 小时),它会自动回退到默认 300 秒 —— 不报错、不提示,就默默切回去。所以设 3600 或 5400 是国内弱网下的安全区间。
另外,http-timeout 设太高也没用:若卡在 DNS 解析或 TLS 握手(比如杀毒软件 HTTPS 扫描、PAC 脚本干扰),再等 20 分钟也是空耗。这时候真正该做的是换 DNS 或关代理,而不是拉 timeout。
- 推荐组合:
http-timeout设600,process-timeout设1800~5400 - 设
0表示禁用超时,但 CI 中绝对禁止 —— 一旦卡死,整个流水线挂住,没人干预就永远等下去 - 若发现每次都在接近设定值(比如设了
1800,总在1790秒左右中断),大概率是 GitHub API 限流或私有 Git 服务响应异常,得查-vvv日志末尾的具体错误码
配置后怎么确认真的在用
很多人改完就以为搞定了,结果装包还是慢,因为镜像源根本没走通,或者被项目级配置覆盖了。必须手动验证两层:
第一层看源是否生效:composer config -g repos.packagist 输出必须是 {"type": "composer", "url": "https://mirrors.aliyun.com/composer"}(注意末尾不能带斜杠);第二层看网络连通:curl -I https://mirrors.aliyun.com/composer/packages.json 必须秒回 200,不能 404、不能超时、不能跳转。
- 项目根目录下有
composer.json且含"repositories"字段,会完全屏蔽全局镜像配置 —— 此时必须检查该项目配置是否正确 - 某些共享主机禁用
http-timeout配置,会静默忽略,此时唯一有效方式是环境变量COMPOSER_HTTP_TIMEOUT -
php -i | grep default_socket_timeout查 CLI 模式下的 PHP 底层 socket 超时,若值为60,即使 Composer 设了600,也会在 60 秒被 PHP 中断,需配合php -d default_socket_timeout=600 $(which composer) install临时绕过
post-install-cmd(比如 npm install 或 php artisan view:clear),这类应从脚本本身入手,而不是无休止拉长 process-timeout。











