根本原因是Composer默认process-timeout(300秒)被多子进程叠加击穿,且http-basic-timeout未同步调高;必须用--timeout=600(等号连接),并配置镜像源、清缓存、验证JSON格式,同时排查DNS与PHP脚本超时。

大型 PHP 项目(如含 Laravel、Symfony 全栈组件或私有 Git 包)执行 composer install 或 composer update 时频繁卡死或报 The process "" exceeded the timeout,根本原因不是网络慢,而是 Composer 默认的 process-timeout(300 秒)被多个子进程叠加击穿——比如同时拉 5 个 Git 仓库,每个平均耗时 80 秒,就极可能超限。
为什么加了 --timeout=600 还失败?
常见误操作是写成 --timeout 600(空格分隔),它会被 Composer 静默忽略;必须用等号:--timeout=600。更隐蔽的问题是:该参数只覆盖 process-timeout,对下载阶段卡在 Downloading https:// 完全无效——那是 http-basic-timeout 管的。
- 命令行参数优先级最高,但每次都要写,CI 中易遗漏
- 若环境变量
COMPOSER_PROCESS_TIMEOUT已设为 300,它会覆盖命令行参数 - Docker CI 中外层
timeout命令或docker run --stop-timeout可能提前 kill 进程,Composer 来不及响应
process-timeout 和 http-basic-timeout 必须同时调高
process-timeout 控制单个子进程(git clone、unzip、php artisan)最大运行时间;http-basic-timeout(Composer 2.2+)控制单次 HTTP 请求从 DNS 解析到 body 传输完成的总耗时。两者独立生效,只改一个大概率仍失败。
- 推荐值:
process-timeout设为1800(30 分钟),http-basic-timeout设为300(5 分钟) - 项目级固化(推荐):
composer config process-timeout 1800+composer config http-basic-timeout 300,写入当前composer.json的config段 - 全局生效:
composer config -g process-timeout 1800和composer config -g http-basic-timeout 300,写入~/.composer/config.json - 验证是否生效:
composer config -g process-timeout应输出1800,composer config -g http-basic-timeout应输出300
镜像源配置错误会导致“看似成功,实则静默失效”
换源命令漏一个字符、少一个斜杠、键名写错,都会让配置完全不生效,但 Composer 不报错。大型项目依赖多,一旦回源 packagist.org,下载失败概率陡增。
- 必须严格匹配键名:
repo.packagist(注意是repo单数,不是repos) -
type值必须是composer,不能省略,也不能拼成compose - URL 必须是 HTTPS 且末尾带
/:https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌ - 验证是否真生效:
composer config -g repo.packagist输出必须是完整 JSON,如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"} - 换源后必须执行
composer clear-cache,否则旧缓存可能干扰
post-install-cmd 脚本超时需单独处理
脚本本身由 PHP 进程执行,超时由 PHP 控制,和 Composer 的 process-timeout 无关。比如 php artisan key:generate 卡住,不是 Composer 超时,而是 Laravel 启动时读取配置失败或文件权限问题。
- 临时方案:
php -d max_execution_time=0 composer install,让整个进程内所有脚本不受 PHP 时间限制 - 精准做法:在脚本内部(如自定义 Artisan 命令)早期调用
set_time_limit(0) - 必加
--no-interaction参数,避免php artisan key:generate等命令等待 stdin 输入 - 手动运行脚本验证:
php artisan key:generate --no-interaction,看是否真卡住还是仅交互阻塞
真正难处理的不是 timeout 数值本身,而是它和 DNS、镜像同步延迟、代理空闲超时、PHP socket 层设置(default_socket_timeout)的叠加效应。调大 timeout 只解决“等太久”,不解决“连不上”——先确认 curl -I https://mirrors.aliyun.com/composer/packages.json 能秒回,再动配置。











