Composer install/update 卡住主因是网络超时,默认300秒,需通过COMPOSER_PROCESS_TIMEOUT=1800配合COMPOSER_HOME=/tmp/composer-tmp生效,或更可靠地执行composer config -g process-timeout 1800写入全局配置。

Composer install/update 时卡住,其实是网络请求超时
Composer 默认的 HTTP 超时时间是 300 秒(5 分钟),但国内源不稳定或代理配置不当的情况下,经常在 Downloading https://packagist.org/packages.json 或下载 zip 包时卡死——这不是“没反应”,而是 curl 底层等了整整 5 分钟才报错。直接调大超时不是万能解法,关键得让 Composer 真正读到你设的值。
必须用 COMPOSER_PROCESS_TIMEOUT 和 COMPOSER_HOME 同时生效
很多人只设 COMPOSER_PROCESS_TIMEOUT,发现没用,是因为 Composer 实际优先读取的是全局配置里的 process-timeout,而环境变量只是“备选”。要让它起效,得配合 COMPOSER_HOME 指向一个干净的配置目录,避免旧配置覆盖:
-
COMPOSER_PROCESS_TIMEOUT=1800:单位是秒,建议设为 1800(30 分钟)足够应对慢速网络 -
COMPOSER_HOME=/tmp/composer-tmp:强制使用空配置目录,跳过 ~/.composer/config.json 的干扰 - Windows 用户注意:
set COMPOSER_PROCESS_TIMEOUT=1800需在同一条命令中和composer install连用,否则子进程不继承
更可靠的方案:改 config.json 而非只靠环境变量
环境变量容易被 CI/CD 环境或 Docker 层级覆盖,真正稳定的方式是写入 Composer 配置文件:
composer config -g process-timeout 1800 composer config -g github-oauth.github.com "your_token_here" # 如需访问私有包,一并配好
这条命令会修改 ~/.composer/config.json,且对所有项目生效。注意:process-timeout 是全局配置项,不能在项目级 composer.json 里设置。
调试是否生效:看 verbose 日志里的 timeout 字段
运行 composer install -v,在日志开头找这一行:
Reading ./composer.json Loading config file /tmp/composer-tmp/config.json Running 2.7.6 (2024-05-22 12:34:56) with PHP 8.2.12 on Linux / 6.5.0-xx <font color="red">Timeout: 1800s</font>
如果显示的是 Timeout: 300s,说明环境变量没加载成功,或者 COMPOSER_HOME 指向了含旧配置的目录。此时别猜,直接删掉 ~/.composer/config.json 再试一次。
超时本质是网络链路问题,环境变量只是开关;真正卡住时,先确认源是否可用、DNS 是否污染、是否误开了 IPv6 fallback —— 这些比调 timeout 数值重要得多。


















