php进程频繁退出大概率是被oom killer杀死,需用dmesg -t | grep -i "killed process"确认;若出现php-fpm或进程名,且时间吻合,则属实;supervisor显示exit status 0是假信号,因内核强杀后伪造状态。

宝塔面板里用 Supervisor 守护的 PHP 进程频繁退出,大概率不是配置错了,而是被 Linux 内核 OOM Killer 杀掉了——得先看 dmesg 日志确认,再决定要不要加内存或调低 PHP 内存限制。
怎么看是不是被 OOM Killer 干掉的
PHP 进程退出时如果没报具体错误,直接消失,最可疑的就是 OOM。执行下面命令快速筛查:
-
dmesg -T | grep -i "killed process"—— 如果输出里出现php-fpm、php或你守护的进程名(比如think),基本坐实 -
dmesg -T | tail -50—— 看最近 50 行内核日志,重点找带Out of memory或invoked oom-killer的行 - 注意时间戳:OOM 杀进程是瞬时动作,日志时间要和你观察到的进程退出时间接近才可信
Supervisor 显示 exit status 0 但实际挂了
这个现象特别有迷惑性:exit status 0 表示进程“正常退出”,但 PHP 进程根本不会自己优雅退出成 0——它被 OOM Killer 强杀后,内核会伪造一个 0 状态上报给父进程(即 Supervisor),导致 Supervisor 误判为“服务主动结束”,从而不触发 autorestart。
- 别信
exit status 0,它在这里是假信号 - 只要
dmesg里有 OOM 记录,就说明进程是被系统强制终止的,和你的启动命令、用户权限、路径都没关系 - Supervisor 的
startretries和startsecs在这种场景下完全无效,因为进程压根没“启动失败”,是启动成功后被秒杀
临时缓解和长期调整怎么做
确认是 OOM 后,不能只靠加内存硬扛,得双线并进:
- 紧急止血:用
swap临时顶住(宝塔「安全」→「Swap」可一键启用 1G 交换分区),避免立刻宕机 - 查 PHP 实际内存占用:
ps aux --sort=-%mem | head -10,重点关注php-fpmworker 或你守护的php think进程的%MEM列 - 调低 PHP 内存上限:编辑对应 PHP 版本的
php.ini,把memory_limit从512M或更高改成256M,然后重启 php-fpm - 检查守护命令是否带冗余参数:比如
php /www/wwwroot/app/artisan queue:work --daemon改成php -d memory_limit=192M /www/wwwroot/app/artisan queue:work --daemon,强制单进程内存封顶 - 真要加物理内存:优先升级服务器 RAM,而不是只靠 Swap,后者会严重拖慢队列消费或 API 响应速度
OOM 不是配置问题,是资源水位真实越界了。日志里没看到 killed process 之前,别急着重装 Supervisor 或改启动脚本——那只是在修一个没坏的零件。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











