做PHP开发的朋友应该都会遇到过这类麻烦,CLI 脚本跑一半意外中断、定时任务没执行完进程就挂了、手动重启进程浪费时间……其实这些问题Supervisor就能很好的解决。它能帮我们自动守护PHP进程,即使挂了也会自动重启,它还能统一管理多个进程,可以让你省出不少的精力去做核心开发。
1. 先搞懂Supervisor 到底是啥
Supervisor是一款轻量级的进程管理工具,是基于Python开发的,专门用来监控、启动、停止和重启进程。对于PHP的项目来说它最核心的作用是:
- 防止PHP脚本(比如队列消费、数据同步脚本)意外退出
- 可以统一管理多个PHP进程,再也不用记一堆的启动命令
2. 如何快速安装
Supervisor是支持Linux/Unix系统的,Windows暂时不适用(Windows 可考虑其他工具)。不同系统安装命令不一样,下面这个直接抄就行:
① Ubuntu/Debian系统
# 更新软件源sudo apt update# 安装 Supervisorsudo apt install -y supervisor
② CentOS/RHEL系统
# 先装 epel 源(CentOS 自带源没有 Supervisor)sudo yum install -y epel-release# 安装 Supervisorsudo yum install -y supervisor
③ 验证安装
安装完成后启动Supervisor服务,再检查状态:
# 启动服务sudo systemctl start supervisord# 设置开机自启(避免服务器重启后失效)sudo systemctl enable supervisord# 检查是否运行正常(出现 active(running) 就是成功)sudo systemctl status supervisord
3. 核心配置可以让PHP进程更听话
Supervisor的配置分两部分,主配置(全局设置)和项目配置(单个 PHP 进程的设置)。主配置不用改太多重点是项目配置。
① 先看主配置(了解即可)
主配置文件路径:/etc/supervisor/supervisord.conf打开文件找到最后一行:
[include]files = /etc/supervisor/conf.d/*.conf
这行意思是所有放在 /etc/supervisor/conf.d/ 目录下、后缀为 .conf 的文件,都会被Supervisor加载。我们的PHP项目配置就放在这个目录里。
② 写PHP项目配置(关键步骤)
假设我们要管理一个PHP 数据同步脚本(路径:/var/www/project/sync_data.php),步骤如下:
- 在
conf.d 目录下新建配置文件,比如 php_sync.conf:
sudo nano /etc/supervisor/conf.d/php_sync.conf
- 粘贴以下配置(每个参数都标了注释,替换成自己的路径即可):
# 定义进程名称(自定义,唯一就行)[program:php_sync_data]# 关键:PHP 脚本的执行命令(先确认 PHP 路径,用 which php 可查)command=/usr/bin/php /var/www/project/sync_data.php# 脚本运行的用户(建议用 www-data 或项目所属用户,避免权限问题)user=www-data# Supervisor 启动时,自动启动这个脚本autostart=true# 脚本意外退出后,自动重启(true 表示总是重启)autorestart=true# 脚本退出后,延迟多久重启(单位:秒)startsecs=3# 日志文件路径(记录脚本输出,方便排查问题)stdout_logfile=/var/log/php_sync/stdout.logstderr_logfile=/var/log/php_sync/stderr.log# 日志文件最大大小(比如 50MB,满了会自动切割)stdout_logfile_maxbytes=50MB# 日志文件保留数量(最多保留 10 个旧日志)stdout_logfile_backups=10
保存退出(nano 编辑器按 Ctrl+O 保存,Ctrl+X 退出)。
# 更新配置(加载新增的 php_sync.conf)sudo supervisorctl update# 启动刚才配置的进程(进程名就是 [program:] 后面的 php_sync_data)sudo supervisorctl start php_sync_data
4. 实战
很多 PHP 项目会用队列比如 Redis 队列、RabbitMQ处理异步任务(比如发送短信、生成报表),但队列消费进程很容易挂。用Supervisor守护就能高枕无忧了。
以Laravel队列为例,配置文件(/etc/supervisor/conf.d/laravel_queue.conf)这样写:
[program:laravel_queue_worker]# Laravel 队列消费命令(--daemon 表示后台运行)command=/usr/bin/php /var/www/laravel-project/artisan queue:work redis --daemon --tries=3user=www-dataautostart=trueautorestart=truestdout_logfile=/var/log/laravel_queue/stdout.logstderr_logfile=/var/log/laravel_queue/stderr.logstdout_logfile_maxbytes=50MBstdout_logfile_backups=10
然后加载配置并启动:
sudo supervisorctl updatesudo supervisorctl start laravel_queue_worker
这样即使队列进程意外退出,Supervisor也会自动重启不用再手动执行 artisan queue:work 了。
5. 常用命令
掌握几个核心命令,就能管好所有PHP进程:
# 查看所有进程状态(running 表示正常,stopped 表示停止)sudo supervisorctl status# 启动单个进程(替换成你的进程名)sudo supervisorctl start php_sync_data# 停止单个进程sudo supervisorctl stop php_sync_data# 重启单个进程(修改脚本后,用这个命令让脚本生效)sudo supervisorctl restart php_sync_data# 停止所有进程sudo supervisorctl stop all# 查看 Supervisor 日志(排查进程启动失败问题)sudo tail -f /var/log/supervisor/supervisord.log
6. 避坑指南
① 进程启动失败?
先看日志配置里写了 stdout_logfile 和 stderr_logfile,用 tail 命令看日志内容:
sudo tail -f /var/log/php_sync/stderr.log
常见原因:PHP路径错了(用 which php 确认)、脚本权限不够(给脚本加执行权限:chmod +x /var/www/project/sync_data.php)、日志目录没创建(手动创建:sudo mkdir -p /var/log/php_sync)。
② 服务器重启后进程没启动
忘记设置Supervisor开机自启了!执行下面这行命令:
sudo systemctl enable supervisord
最后说两句
Supervisor对PHP项目来说,是个小而美的工具。不用写复杂的shell脚本,几行配置就能搞定进程守护,省出的时间能多写几个功能、多测几个bug。刚开始用可能记不住命令,收藏这篇文章,下次需要时直接抄配置、查命令就行~