答案:Composer超时由process-timeout、http-basic-timeout和PHP的max_execution_time分层控制,须按-vvv日志末行精准定位卡点——Resolving依赖查DNS,Downloading查http-basic-timeout,Executing命令查process-timeout,脚本执行查max_execution_time。

Composer 本身没有“timeout 设置”这个独立配置项,所有超时行为都由几个互不干扰的机制分别控制:主命令生命周期、HTTP 下载请求、PHP 脚本执行。盲目改 --timeout 可能无效,甚至掩盖真实瓶颈。
process-timeout 控制整个 install/update 生命周期
这是最常被误用也最关键的配置。它决定从命令启动到退出的总耗时上限,默认 300 秒(5 分钟),超时后抛出 ProcessTimedOutException。
-
--timeout=1200是临时覆盖方式,必须带等号;写成--timeout 1200会被静默忽略 - 全局永久生效:运行
composer config -g process-timeout 1200,写入~/.composer/config.json - 项目级生效(推荐 CI/CD 使用):去掉
-g,即composer config process-timeout 900 - 设为
0表示禁用超时,但不建议长期使用——一旦网络卡死或镜像不可用,进程会无限挂起 - 注意:该值包含 git clone、解压、脚本执行等全部子进程耗时,不是单次操作时限
http-basic-timeout 单独控制每次 HTTP 请求
Composer 2.2+ 才支持此参数,专门约束每个包下载请求的连接与读取时间,默认仅 60 秒。很多“超时”实际卡在拉 zip 包阶段,只调 --timeout 没用。
- 临时启用:
composer update --http-basic-timeout=300(单次请求最长等 5 分钟) - 配合
--timeout使用更稳妥:composer install --timeout=1200 --http-basic-timeout=240 - 全局设置:
composer config -g http-basic-timeout 300 - 旧版本 Composer 不识别该参数,强行加会报错或忽略
PHP 的 max_execution_time 影响自定义脚本执行
Composer 的 post-install-cmd 或 pre-deploy 等脚本是 PHP 进程运行的,不受 process-timeout 管控。它们受 PHP 自身 max_execution_time 限制,默认也是 300 秒。
- 临时绕过:
php -d max_execution_time=0 composer install(0 表示不限制) - CI/CD 中显式指定更可靠:
php -d max_execution_time=900 composer run-script post-build - 脚本内部也可调
set_time_limit(1200),但必须在逻辑开头立即执行,且不能在被 disable_functions 禁用的环境中使用 -
set_time_limit()对 CLI 模式有效,对某些嵌入式 SAPI 无效
真正卡住时,timeout 往往不是问题根源
很多报 “The process timed out” 的场景,实际是内存不足、I/O 阻塞或镜像未切导致的假性超时。延长 timeout 只是延缓失败,而非解决问题。
- 检查
memory_limit是否 ≥ 1.5G,尤其composer update解析锁文件阶段容易 OOM - 国内用户务必先切镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/,再禁用回源:composer config -g repo.packagist false - 跳过 autoload 生成可大幅缩短安装时间:
composer install --no-autoloader,之后单独运行composer dump-autoload --optimize - Docker 容器中设了
COMPOSER_PROCESS_TIMEOUT,但外层有docker run --stop-timeout或系统timeout命令,Composer 根本来不及响应就被 kill
超时配置不是越长越好,关键要分清是哪一层在卡:网络下载?PHP 脚本?还是子进程资源争抢。优先换镜像、关回源、升内存,再谈调 timeout。


















