SIGTERM中断导致vendor损坏因Composer无原子写入,解压后rename前被终止,造成目录空置或installed.json截断;须清缓存、彻底删vendor、用--no-cache重装。

Composer 被 SIGTERM 中断后 vendor 为什么损坏
不是所有中断都等价。SIGTERM(比如 kill -15、CI 环境超时 kill、Docker stop 默认信号)会立即终止 PHP 进程,但 Composer 不做原子写入:它先解压 zip 到临时目录,再 rename() 移入 vendor/。SIGTERM 可能卡在 rename 前一刻,导致目录结构半残——vendor/package-name/ 存在但为空,或 vendor/composer/installed.json 写到一半被截断。
怎么判断是 SIGTERM 导致的损坏而非网络问题
看错误是否集中在「文件系统层面」且无网络关键词:
-
Invalid argument supplied for foreach()→vendor/composer/installed.json被截断(JSON 不完整) -
mkdir(): Permission denied或realpath(): Invalid argument→ 目录已建但权限/路径状态异常 - 运行
ls -la vendor/monolog/monolog/发现目录存在但src/下无任何文件 -
composer install -v日志里没出现Downloading或Extracting,直接报 autoload 失败
修复必须清缓存 + 彻底删 vendor + 不跳过校验
SIGTERM 中断后残留的缓存 zip 往往是「已解压一半」或「校验未完成」状态,composer clear-cache 必须执行,否则重装会复用坏包:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 先执行
composer clear-cache(清掉~/.composer/cache/files/里的损坏 zip) - 再彻底删除 vendor:
rm -rf vendor(不是rm -r vendor/*,必须连目录一起删) - 最后运行
composer install --no-cache(--no-cache强制跳过所有本地缓存,避免复用残留元数据) - 别加
--no-scripts或--no-plugins—— SIGTERM 损坏的是文件系统状态,不是脚本逻辑,跳过脚本反而掩盖真实问题
预防 SIGTERM 中断的关键配置
CI/容器环境最易触发 SIGTERM,需主动延长容忍窗口并禁用非必要阻塞:
- 调高 process-timeout:
composer config -g process-timeout 1800(默认 300 秒太短,尤其含大包时) - 强制走 dist 包:
composer install --prefer-dist(比 git clone 更快、更少 I/O,降低被 kill 概率) - Docker 中加
STOPSIGNAL SIGQUIT(让 Composer 收到退出信号时有机会清理,而非硬 kill) - CI 脚本里用
timeout 30m composer install替代无时限命令,避免超时后被系统强杀
真正麻烦的是 vendor 目录权限混乱或磁盘满——SIGTERM 只是表象,底层资源不足才会让中断后果不可逆。修复前先确认 df -h 和 ls -ld vendor。

















