composer 的 scripts 无原生超时配置,需用系统命令封装:linux/macos 用 timeout(macos 用 gtimeout),windows 用 powershell start-process -timeoutsec 封装脚本;process-timeout 仅作用于 composer 自身操作,对 scripts 无效。

composer.json 里 scripts 超时怎么调?
默认情况下,Composer 执行 scripts 里的命令(比如 phpunit、php-cs-fixer)没有硬性超时限制,但实际会受 PHP 的 max_execution_time 或系统级进程限制影响——这会导致脚本卡住、CI 失败却无明确报错。真正可控的超时配置,得靠外部命令封装,不是 Composer 原生支持。
用 timeout 命令包装 script(Linux/macOS)
最直接有效的方式:在 scripts 中用系统 timeout 命令包裹目标命令。它能精确控制秒级超时,并返回非零退出码,让 Composer 中断后续流程。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
timeout是 GNU coreutils 工具,macOS 需先装brew install coreutils,然后用gtimeout - 示例:把 PHPUnit 运行限制在 120 秒内,超时自动 kill
"test": "timeout 120 vendor/bin/phpunit" - 加
--preserve-status可确保被杀时返回 124(标准 timeout 超时码),CI 能识别为失败 - 注意:Windows 不原生支持
timeout,下文另说
Windows 下怎么设 script 超时?
PowerShell 的 Start-Process + -Wait -TimeoutSec 可模拟,但有坑:超时后进程未必干净退出,且 Composer 在 Windows 上对 PowerShell 脚本路径和引号处理容易出错。
- 推荐折中方案:写一个
run-with-timeout.ps1脚本放项目根目录,内容类似:Start-Process -FilePath "$args[0]" -ArgumentList $args[1..$args.Length] -Wait -TimeoutSec 120
- 在
composer.json中调用:"test": "powershell -ExecutionPolicy Bypass -File run-with-timeout.ps1 vendor\bin\phpunit" - 注意双反斜杠转义、PowerShell 执行策略限制、以及
Start-Process对重定向的支持较弱
为什么不能直接配 composer.json 的 timeout 字段?
有人试过在 config 里加 "process-timeout": 300,但这只控制 Composer 自身下载/更新包时的子进程超时,对 scripts 完全无效。官方 issue 明确说过:scripts 是 shell 直接执行,超时必须由宿主环境保障。
-
process-timeout影响的是composer install期间运行git clone或unzip等操作 -
scripts启动的是全新子进程,Composer 不介入其生命周期管理 - 试图用
set_time_limit()在 PHP 脚本里设超时,只对当前 PHP 进程生效,无法约束exec()出来的外部命令
timeout-minutes),别指望靠改一行 JSON 解决。










