Composer报Killed是OOM Killer所致,需查dmesg确认;无Swap则必触发,应设600权限并挂载;降内存峰值须用--no-dev、--optimize-autoloader、--prefer-dist及升级Composer 2.x。

Composer 报 Killed,基本就是 Linux 内核的 OOM Killer 干的——不是 Composer 崩溃,是进程被强制终止。改 memory_limit 或加 -d memory_limit=2G 没用,它发生在 PHP 内存机制之前,系统已经没得选了。
怎么确认真是 OOM Killer 杀的
别猜,直接查内核日志:
- 运行
dmesg -O | grep -i "killed process",看到类似Out of memory: Kill process 12345 (php) score 894就是铁证 - 顺手跑
swapon --show和free -m | grep Swap:如果Swap行 total 是 0,说明压根没 Swap,OOM 几乎必然发生 - 查系统日志也行:
grep -i "out of memory" /var/log/syslog(Ubuntu/Debian)或/var/log/messages(CentOS/RHEL)
为什么加了 Swap 还被 Kill
Swap 文件建了、swapon 也执行了,但依然被杀,大概率是权限或路径踩了坑:
-
sudo chmod 600 /swapfile必须执行——Linux 要求 Swap 文件权限严格为 600,漏掉这步就白搭 -
sudo chown root:root /swapfile确保所有权正确 - 别把
/swapfile放在/tmp、/var/tmp或 Docker volume 挂载目录下;推荐用/swapfile(根目录)或/var/_swap_/swapfile - 验证是否真生效:
swapon --show必须有输出,且free -m中Swap行的total > 0
不靠 Swap,怎么压 Composer 内存峰值
Swap 是兜底手段,真正降内存得从 Composer 自身行为入手:
- 加
--no-dev:跳过require-dev解析和autoload-dev生成,省掉 30%–50% 内存 - 加
--optimize-autoloader(或简写-o):生成静态 classmap,避免运行时扫描 - 设环境变量
COMPOSER_MEMORY_LIMIT=512M(不建议设-1,低配机上反而容易触发 OOM) - 用
--prefer-dist:优先下 zip 包而非 git clone,减少进程和内存开销 - 升级到 Composer 2.x:依赖求解器重写后内存更可控,老版本 1.x 在 Laravel/Docker 场景下极易爆掉
Docker/CI 里静默退出(exit code 137)怎么办
GitHub Actions、GitLab CI、Docker 默认限制内存且不暴露 kill 日志,现象常是静默退出:
- CI 脚本开头加
export COMPOSER_MEMORY_LIMIT=512M(比php -d更稳,Composer 自己识别) - 加
--no-progress --verbose暴露最后执行的命令,定位卡点 - 容器启动时加内存限制:
docker run -m 2g your_image - CI 中优先用
composer install --no-dev --prefer-dist --optimize-autoloader
最易被忽略的是:Swap 启用了但没写进 /etc/fstab,服务器一重启就失效;还有就是 Xdebug 没关,它会让 Composer 内存占用翻倍——哪怕只是开发机,也建议在跑 composer install 前临时禁用。











