composer脚本超时90%由process-timeout默认300秒过短导致,需通过该配置项调整;确认方式为错误含processtimedoutexception或-v输出卡在本地命令;推荐项目级设1800秒,环境变量适用于ci,避免设≥7200被忽略。

Composer 执行脚本超时,90% 是 process-timeout 默认 300 秒太短导致的,不是网络慢、不是 PHP set_time_limit() 问题,更不是镜像源没换对——直接调这个值最有效。
怎么确认是 process-timeout 导致的?
关键看错误信息里是否含 Symfony\Component\Process\Exception\ProcessTimedOutException 或文字明确出现 The process timed out。加 -v 参数重跑能进一步验证:
- 运行
composer run-script xxx -v,观察最后输出的Running command (CWD):是哪条命令卡住 - 如果最后是
php artisan migrate、php tests/run.php或npm run build这类本地命令,基本可锁定为process-timeout触发 - 如果卡在
Downloading https://或报curl error 28,那是http-timeout问题,和脚本无关
process-timeout 的三种设置方式及优先级
优先级从高到低:命令行参数 > 环境变量 > 项目级配置。全局配置(composer config --global process-timeout)在 Composer ^2.2+ 已废弃,别用。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
临时覆盖(调试/CI 单次运行):
COMPOSER_PROCESS_TIMEOUT=1800 composer run-script deploy或composer run-script deploy --process-timeout=1800 -
项目级(推荐,可提交进 Git):运行
composer config process-timeout 1800,写入当前composer.json的"config"段 -
环境变量(CI/CD 首选):Linux/macOS 下
export COMPOSER_PROCESS_TIMEOUT=1800;Windows PowerShell 下$env:COMPOSER_PROCESS_TIMEOUT="1800"
设多少才合理?别踩 7200 秒硬编码陷阱
process-timeout 不是越大越好,Composer 内部有硬限制:
- 设为
0表示禁用检查,但不建议——遇到 SSH 失败或死循环脚本会无限 hang 住 - 设为
7200(2 小时)及以上,Composer 会直接忽略该值,强制回退到默认 300 秒 - 常见合理值:
1800(30 分钟)适合 CI,3000(50 分钟)适合本地开发大迁移或导出场景 - 若脚本稳定耗时超 30 分钟,说明它本身该拆分或加进度反馈,而不是靠拉长 timeout 掩盖问题
容易被忽略的真相:超时只是表象
真正容易被忽略的是:process-timeout 只是暴露了底层问题——比如某条 post-install-cmd 脚本效率低下,或者 vendor 目录存在大量 symlink 导致 autoload 生成极慢。盲目调高 timeout,可能掩盖 SSH 密钥缺失、内存不足、或 symlink 扫描死循环等真实故障点。先用 -v 定位卡在哪条命令,再针对性优化,比无脑加秒数靠谱得多。










