PHP项目如何配置服务器自动重启?

wen PHP项目 36

本文目录导读:

PHP项目如何配置服务器自动重启?

  1. 等待旧进程释放
  2. 确保新进程已就绪

在 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 + 健康检查实现优雅重启

步骤:

  1. Nginx 配置健康检查(使用 nginx_upstream_check_module):

    upstream backend {
     server 127.0.0.1:9000;
     check interval=3000 rise=2 fall=5 timeout=1000 type=http;
    }
  2. 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 流程控制重启,避免意外触发导致服务抖动。**

抱歉,评论功能暂时关闭!