PHP脚本在后台运行时被系统Kill掉,通常是因为进程运行超时、内存占用过高触发系统OOM机制,或者服务器重启后进程没有自动拉起导致的。使用Supervisor管理PHP进程可以有效避免这些问题,它能实时监控进程状态,进程异常退出时自动重启,还能配置开机自启。

PHP脚本被系统Kill的常见原因
了解脚本被Kill的原因,才能更有针对性地解决问题,常见原因主要有以下几类:
- 系统OOM机制触发:当PHP脚本内存占用过高,超过系统设定的阈值时,系统的Out Of Memory Killer会强制终止内存占用最高的进程,避免系统崩溃。
- 进程运行超时:部分系统或者运维配置会对后台进程的运行时长做限制,超过指定时间后自动终止进程。
- 服务器重启未自启:PHP后台进程没有配置开机自启,服务器重启后进程不会自动运行,看起来像是被Kill掉的情况。
- 脚本自身异常退出:PHP脚本运行时出现未捕获的异常、致命错误,会导致进程直接退出,没有自动重启机制的话就会彻底停止。
Supervisor基础介绍
Supervisor是用Python开发的通用进程管理工具,主要作用是对类Unix系统上的进程进行监控和管理,核心功能包括:
- 自动重启异常退出的进程,可配置重启次数限制和重启间隔。
- 支持进程分组管理,批量启动、停止、重启一组进程。
- 提供命令行工具和Web管理界面,方便查看进程状态和操作进程。
- 支持配置进程开机自启,服务器重启后自动拉起配置的进程。
安装Supervisor
不同系统的安装方式略有差异,以下是常见系统的安装方法:
CentOS/RHEL系统安装
使用yum包管理器安装,执行以下命令:
# 安装epel源,如果已经安装可以跳过 yum install -y epel-release # 安装supervisor yum install -y supervisor # 启动supervisor服务并设置开机自启 systemctl start supervisord systemctl enable supervisord
Ubuntu/Debian系统安装
使用apt包管理器安装,执行以下命令:
# 更新软件源 apt update # 安装supervisor apt install -y supervisor # 启动supervisor服务并设置开机自启 systemctl start supervisor systemctl enable supervisor
使用pip安装
如果系统没有对应的包管理器,也可以通过Python的pip工具安装:
# 安装supervisor pip install supervisor # 生成默认配置文件 echo_supervisord_conf > /etc/supervisord.conf # 启动supervisord supervisord -c /etc/supervisord.conf
配置Supervisor管理PHP进程
Supervisor的配置文件分为主配置文件和进程配置文件,推荐将不同进程的配置文件放在独立的目录下,方便管理。
修改主配置文件
主配置文件默认路径通常是/etc/supervisord.conf,打开文件找到[include]配置段,修改为如下内容,指定进程配置文件的存放目录:
[include] files = /etc/supervisord.d/*.ini
这样所有放在/etc/supervisord.d/目录下,后缀为.ini的文件都会被加载为进程配置。
创建PHP进程配置
假设我们有一个需要持续运行的PHP脚本,路径为/data/php/task.php,内容如下:
<?php
// 模拟持续运行的PHP后台任务
while (true) {
// 执行任务逻辑,这里以写入日志为例
file_put_contents('/data/php/task.log', date('Y-m-d H:i:s') . " 任务执行中n", FILE_APPEND);
// 休眠10秒
sleep(10);
}
?>
在/etc/supervisord.d/目录下创建配置文件php_task.ini,内容如下:
[program:php_task] ; 进程名称,自定义即可 command=/usr/bin/php /data/php/task.php ; PHP可执行文件路径,通过which php命令可以查看 directory=/data/php ; 进程运行的工作目录 autostart=true ; supervisor启动时自动启动该进程 autorestart=true ; 进程异常退出时自动重启 startretries=3 ; 启动失败时的重试次数 user=www ; 运行进程的用户,避免权限问题 redirect_stderr=true ; 把错误输出重定向到标准输出 stdout_logfile=/data/php/php_task.log ; 标准输出日志文件路径 stdout_logfile_maxbytes=50MB ; 单个日志文件最大大小 stdout_logfile_backups=10 ; 日志文件备份数量
加载配置并启动进程
配置文件创建完成后,执行以下命令更新Supervisor配置并启动进程:
# 更新supervisor配置 supervisorctl update # 启动php_task进程 supervisorctl start php_task # 查看进程状态 supervisorctl status
如果配置正确,执行supervisorctl status会看到php_task进程的状态为RUNNING。
验证进程管理效果
我们可以手动终止PHP进程,验证Supervisor是否会自动重启:
# 查看php_task进程的PID ps aux | grep php_task # 终止进程,替换下面的PID为实际查到的进程ID kill -9 12345 # 再次查看进程状态,会发现进程已经自动重启,PID发生了变化 supervisorctl status
另外可以查看/data/php/task.log日志文件,会发现日志一直在持续写入,没有因为进程被终止而中断,说明Supervisor已经生效。
常用Supervisor命令
日常管理中常用的Supervisor命令如下:
| 命令 | 作用说明 |
|---|---|
| supervisorctl status | 查看所有管理的进程状态 |
| supervisorctl start 进程名 | 启动指定进程 |
| supervisorctl stop 进程名 | 停止指定进程 |
| supervisorctl restart 进程名 | 重启指定进程 |
| supervisorctl update | 更新配置,加载新增或修改的进程配置 |
| supervisorctl reload | 重启supervisord服务,重新加载所有配置 |
注意事项
- 配置进程的运行用户时,要确保该用户对PHP脚本文件、日志目录有读写权限,避免出现权限错误导致进程启动失败。
- 如果PHP脚本有输出内容,一定要配置
stdout_logfile参数,否则Supervisor可能会因为无法处理进程输出而导致进程启动失败。 - 如果服务器开启了防火墙,需要放行Supervisor的Web管理界面端口的话,要注意配置访问控制,避免未授权访问。
- 当修改了进程的配置文件后,一定要执行
supervisorctl update或者supervisorctl reload才能让配置生效,直接修改文件不会自动加载。
使用Supervisor管理PHP后台进程,能够有效解决进程被系统Kill、重启后无法自启等问题,大幅提升后台任务的稳定性,是PHP后台任务管理的常用方案。
PHPSupervisor进程管理后台运行修改时间:2026-06-11 05:42:40