必须同时调整process-timeout和http-basic-timeout,前者控整个命令生命周期(默认300秒),后者控单次HTTP请求(默认60秒,仅2.2+支持),二者独立生效、缺一不可;仅调其一仍会超时失败。

直接改 process-timeout 和 http-basic-timeout 是最有效的做法,但只调一个大概率还是失败——这两个参数独立生效,必须配对调整。
为什么改了 timeout 还报错?
常见错误现象是执行 composer install 或 composer update 卡在 downloading 阶段,最后抛出 file could not be downloaded: failed to open stream: Connection timed out。这不是命令写错了,而是 Composer 内置的双重超时限制在起作用:
-
process-timeout控制整个命令生命周期(含依赖解析、下载、解压、运行钩子),默认仅 300 秒 -
http-basic-timeout控制单次 HTTP 请求(比如拉 ZIP 包),默认仅 60 秒,且仅 Composer 2.2+ 支持 - 如果网络慢但稳定,
process-timeout不够会提前中止;如果镜像响应慢或包大,http-basic-timeout不够会导致单个请求反复失败
临时生效:命令行参数怎么加?
适合调试或 CI 环境快速绕过,不改配置文件:
- 延长整体时限:
composer update --timeout=1800(单位秒,设为 30 分钟) - 放宽单次 HTTP 请求:
composer install --http-basic-timeout=300(5 分钟,旧版本忽略此参数) - 两个一起用更稳妥:
composer install --timeout=1200 --http-basic-timeout=240
永久生效:全局 config 怎么写?
推荐优先改全局配置,避免每个项目重复设置。运行以下命令即可写入 ~/.composer/config.json:
composer config -g process-timeout 1800composer config -g http-basic-timeout 300- 改完不用重启终端,下次命令自动读取
- 值设为
0表示不限时(不建议,可能卡死无响应)
比改 timeout 更关键的一步:换镜像 + 关闭回源
单纯延长超时只是“等得更久”,不能解决网络不稳定的根本问题。国内用户真正卡住的主因是连接 packagist.org 失败,而不是时间不够:
- 先切换镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 再禁用 fallback(防止自动回退到官方源拖慢流程):
composer config -g repo.packagist false - 务必清缓存:
composer clear-cache,否则旧的packages.json元数据还在本地,根本不会发请求 - 验证是否生效:
composer global require monolog/monolog -vvv 2>&1 | grep "Downloading",看到 URL 是阿里云地址才算成功
容易被忽略的是 PHP 自身的 default_socket_timeout ——如果它低于你设的 http-basic-timeout,连接会在 Composer 层之前就被掐断。查一下:php -i | grep default_socket_timeout,若输出是 60,记得同步调高它(如通过 php -d default_socket_timeout=300 启动)。











