supervisor 是用 python 编写的进程管理工具,用于在 linux 中可靠运行 php 常驻脚本;它自动重启崩溃进程、统一管理多服务、重定向日志、支持信号处理与优雅退出,并提供命令行控制接口。

Supervisor 是一个用 Python 编写的进程管理工具,特别适合在 Linux 环境中长期运行 PHP 常驻内存脚本(如队列消费者、WebSocket 服务、定时轮询任务等)。它能自动拉起崩溃的进程、记录日志、提供命令行控制接口,比单纯用 nohup 或 screen 更可靠、更可控。
为什么 PHP 脚本需要 Supervisor 管理
PHP 默认是“请求-响应”模型,脚本执行完即退出。若要实现常驻内存(例如监听 Redis 队列或 TCP 连接),需手动写死循环(while(true)),但这类脚本一旦异常退出、内存泄漏或被 OOM kill,就没人重启它。Supervisor 正是解决这个问题的核心:它不修改你的 PHP 代码,只负责“看门”——确保进程始终存活,并在出错时按策略重启。
- 自动重启意外终止的 PHP 进程
- 统一管理多个常驻脚本(如订单消费 + 库存同步 + 推送服务)
- 标准输出/错误可重定向到文件,便于排查问题
- 支持开机自启、状态查询(
supervisorctl status)、手动启停
安装与基础配置(以 Ubuntu/Debian 为例)
先安装 Supervisor:
sudo apt update && sudo apt install supervisor
默认配置文件在 /etc/supervisor/supervisord.conf,通常无需改动主配置,而是为每个 PHP 脚本单独建一个 conf 文件,放在 /etc/supervisor/conf.d/ 下:
例如创建 /etc/supervisor/conf.d/php-worker.conf:
[program:php-worker] command=php /var/www/app/worker.php directory=/var/www/app user=www-data autostart=true autorestart=true startretries=3 redirect_stderr=true stdout_logfile=/var/log/supervisor/php-worker.log stopwaitsecs=10
关键字段说明:
- command:要执行的 PHP 脚本完整路径,建议用绝对路径
- user:指定运行用户,避免用 root,推荐和 Web 服务一致(如 www-data)
-
autorestart:设为
true表示进程退出后自动重启(包括正常 exit 和崩溃) -
stopwaitsecs:发送 SIGTERM 后等待几秒再发 SIGKILL,给脚本留出清理时间(PHP 中可用
pcntl_signal捕获信号)
让 PHP 脚本能优雅退出和响应信号
Supervisor 发送 stop 命令时,默认发 SIGTERM。如果 PHP 脚本不处理该信号,会立刻被杀掉,可能导致数据丢失(比如正在处理一半的队列任务)。因此建议在脚本开头加入信号处理逻辑:
pcntl_async_signals(true);
pcntl_signal(SIGTERM, function() {
echo "Received SIGTERM, shutting down...\n";
exit(0);
});
pcntl_signal(SIGINT, function() {
echo "Received SIGINT, shutting down...\n";
exit(0);
});
while (true) {
// 处理一条任务
$job = redisPop('queue:jobs');
if ($job) {
process($job);
}
usleep(100000); // 100ms 间隔,避免空转
}
这样执行 supervisorctl stop php-worker 时,脚本能完成当前任务再退出,真正“优雅”。
日常运维常用命令
配置完成后,记得重载 Supervisor 配置并启动:
sudo supervisorctl rereadsudo supervisorctl updatesudo supervisorctl start php-worker
其他实用命令:
-
supervisorctl status:查看所有进程状态(RUNNING / STOPPED / STARTING) -
supervisorctl tail php-worker stdout:实时查看脚本标准输出 -
supervisorctl restart php-worker:重启单个进程 -
sudo systemctl enable supervisor:设置开机自启(部分系统需启用 systemd 服务)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











