composer脚本默认超时300秒,因symfony process硬编码限制;需通过process-timeout配置项调整,支持项目级、全局、临时三种方式,设为0可禁用超时。

Composer 脚本默认超时是 300 秒(5 分钟),超出会直接报错 ProcessTimedOutException;不能靠 timeout 命令或系统级设置绕过,必须通过 Composer 自身配置项调整。
为什么 composer run-script 会超时?
Composer 内部用 Symfony Process 执行脚本,硬编码了超时逻辑。即使你的 PHP 脚本本身没设 set_time_limit(0),Composer 也会在 300 秒后主动 kill 进程。
常见触发场景:
- 执行数据库迁移、大文件导出等长耗时脚本
- 本地开发环境跑
phpunit或phpstan时因扫描范围大而卡住 - CI 环境中因 I/O 慢(如挂载卷、低配机器)导致看似“正常”的脚本被误杀
正确配置方式:改 process-timeout 配置项
这个值控制所有通过 composer run-script、composer install(含 post-install-cmd)等触发的子进程超时,单位是秒。
有三种生效方式,优先级从高到低:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 项目级配置(推荐):
composer config process-timeout 1800
(写入当前项目的composer.json的config段) - 全局配置:
composer config -g process-timeout 1800
(影响所有项目,慎用) - 临时覆盖:
COMPOSER_PROCESS_TIMEOUT=1800 composer run-script xxx
(仅当次命令有效)
注意:process-timeout 不是 timeout,拼错无效;设为 0 表示禁用超时(不建议生产环境使用)。
验证是否生效 & 常见失效原因
运行 composer config process-timeout 可查看当前值。但要注意以下坑:
- 如果项目
composer.json中已有"config": {"process-timeout": 300},而你只运行了全局配置,它不会覆盖——Composer 优先读项目配置 - 某些旧版 Composer(process-timeout 支持不稳定,升级到
^2.2或更高更可靠 - 脚本本身抛出的是 PHP Fatal Error 或内存溢出(
Allowed memory size exhausted),不是超时,调process-timeout没用,得调memory-limit
真正卡死时,错误信息里一定包含 Symfony\Component\Process\Exception\ProcessTimedOutException,这是唯一判断依据。
超时配置只是开关,不解决脚本本身效率问题;如果一个脚本稳定需要 10 分钟,说明它大概率该拆分或加进度反馈,而不是无限制拉长 timeout。










