本文目录导读:

在 PHP 项目中配置服务器自动重启,主要取决于你的运行环境(开发机还是生产服务器、Docker 还是裸机)以及 PHP 运行方式(FPM、内置服务器、Swoole/Workerman 常驻进程等)。
以下是针对不同场景的配置方案:
开发环境:PHP 内置服务器自动重启(文件修改时)
使用 php -S 时内置服务器无法自动检测文件变化,推荐使用工具实现热重载:
方案 A:使用 phpwatch
# 安装 composer global require sebastian/phpwatch # 运行(监听当前目录,启动内置服务器) phpwatch --exec="php -S localhost:8080 -t public" .
方案 B:使用 nodemon(Node.js 工具)
# 安装 nodemon npm install -g nodemon # 监听 .php 文件,自动重启 built-in server nodemon --ext php --exec "php -S localhost:8080 public/index.php"
生产环境:PHP-FPM 进程自动重启
PHP-FPM 本身是常驻服务,故障时由系统服务管理器(systemd/supervisor)自动拉起。
1 基于 systemd(主流 Linux)
# 查看 FPM 服务名 systemctl list-units | grep php # 配置自动重启(编辑服务文件) sudo systemctl edit php8.1-fpm # 添加以下内容 [Service] Restart=always RestartSec=3s
2 基于 Supervisor(复杂进程管理)
[program:php-fpm] command=php-fpm -F autostart=true autorestart=true startretries=3 stderr_logfile=/var/log/php-fpm.err.log stdout_logfile=/var/log/php-fpm.out.log
常驻内存型 PHP(Swoole / Workerman / ReactPHP)
这类框架需要手动监听代码变动并触发平滑重启。
推荐:swoole-php-watcher + 信号机制
// 在管理脚本中实现
public function onStart()
{
// 启动文件监听
$watcher = new \WyriHaximus\React\InspectorWatcher(...);
$watcher->on('change', function ($file) {
echo "File changed: $file, restarting...\n";
// 向主进程发送 SIGUSR1 实现平滑重启
posix_kill($this->pid, SIGUSR1);
});
}
对于 Workerman,直接使用 reload 命令:
# 监听文件变动时手动执行 php start.php reload # 或结合 inotifywatch inotifywatch /data/www/ && php start.php reload
Docker 环境中的自动重启
通过设置容器的重启策略实现进程守护。
Docker Compose 方式:
services:
php-app:
image: php:8.2-fpm
restart: unless-stopped # 关键参数
command: php -S 0.0.0.0:8080 -t /app
Docker Run 方式:
docker run -d --restart=always --name php-app my-php-image
生产环境高级:结合 Nginx + 健康检查实现优雅重启
步骤:
-
Nginx 配置健康检查(使用
nginx_upstream_check_module):upstream backend { server 127.0.0.1:9000; check interval=3000 rise=2 fall=5 timeout=1000 type=http; } -
PHP-FPM 重启脚本(零宕机):
#!/bin/bash # 先停止旧进程(但保留当前请求) kill -USR2 $(cat /run/php-fpm.pid)
等待旧进程释放
sleep 5
确保新进程已就绪
if [ -f /var/run/php-fpm.pid.new ]; then mv /var/run/php-fpm.pid.new /var/run/php-fpm.pid fi
---
### 6. 异常自动重启:监控 + 触发
#### 使用 Monit(轻量级监控):
check process php-fpm with pidfile /run/php/php8.1-fpm.pid start program = "/etc/init.d/php8.1-fpm start" stop program = "/etc/init.d/php8.1-fpm stop" if failed unixsocket /run/php/php8.1-fpm.sock then restart if 5 restarts within 5 cycles then timeout
---
### 🔥 最佳实践总结
| 场景 | 推荐方案 | 配置要点 |
|------|---------|---------|
| 开发/调试 | `phpwatch` + `nodemon` | 监听 `.php` 文件变化 |
| PHP-FPM 生产 | systemd `Restart=always` | 设置 `RestartSec` 防频繁重启 |
| Swoole 生产 | 代码内实现文件监控+reload信号 | 使用 `inotify` 或 `fswatch` |
| Docker 部署 | `restart: unless-stopped` | 配合 healthcheck 检测存活 |
| 零宕机升级 | Nginx upstream check + 信号平滑重启 | 使用 `SIGUSR2` 实现无缝切换 |
**注意:生产环境不要依赖“文件修改自动重启”,应通过 CI/CD 流程控制重启,避免意外触发导致服务抖动。**