PHP 怎么热启动

wen PHP项目 2

本文目录导读:

PHP 怎么热启动

  1. 传统 PHP(PHP-FPM + Nginx/Apache)
  2. 常驻内存框架(Swoole / Workerman)
  3. 开发环境(本地调试)
  4. 终极方案:OpCache 热更新(生产环境推荐)
  5. 总结:选择哪种方案?

在 PHP 中,“热启动”通常指在不重启 Web 服务器(如 Nginx/Apache)或不中断当前服务的情况下,重新加载服务端代码,由于 PHP 本身的执行机制不同,热启动的实现方式差异很大,以下是针对不同场景的详细方案:


传统 PHP(PHP-FPM + Nginx/Apache)

这是最普遍的场景,代码修改后无需重启服务,因为 PHP 每次请求都会重新编译执行,但如果你需要“平滑重启” PHP-FPM(比如修改了 php.ini 或扩展配置),可以采用以下方式:

方案 A:平滑重载 PHP-FPM(不丢请求)

# 优雅重启(先处理完当前请求再退出)
kill -USR2 $(cat /var/run/php-fpm.pid)
# 或使用 systemd(推荐)
systemctl reload php-fpm

原理USR2 信号会让 PHP-FPM 重新加载配置文件,同时保留现有的 worker 进程处理完当前请求后才退出,等待新请求时使用新配置。


常驻内存框架(Swoole / Workerman)

这类框架常驻内存,代码修改后必须重启才能生效,但可做到不中断服务

方案 B:Swoole 热重载(代码改动自动生效)

// 在 Swoole 服务中添加热重载逻辑
$server->on('WorkerStart', function ($server, $workerId) {
    // 如果是自定义进程,可监听文件变化
    if ($workerId === 0) {
        swoole_timer_tick(2000, function () use ($server) {
            $changed = swoole_last_error(); // 模拟检查文件变更
            if (filemtime('app.php') > $server->lastUpdate) {
                $server->reload(); // 平滑重启所有 Worker
                $server->lastUpdate = time();
            }
        });
    }
});

实战命令(手动触发热重载):

# 向 Swoole 主进程发送 SIGUSR1 信号
kill -USR1 $(cat swoole.pid)

方案 C:Workerman 热重启

# 优雅重启(等待当前请求处理完成后重启)
php start.php reload

特点:立即生效,不会丢失正在处理的连接。


开发环境(本地调试)

开发时希望代码修改立即生效,无需手动重启:

方案 D:使用 php -S 内置服务器 + 自动重载

# 配合 watchexec(Linux/macOS)
watchexec -e php "php -S localhost:8000"
# 或使用 Laravel 开发服务器(自动刷新)
php artisan serve

终极方案:OpCache 热更新(生产环境推荐)

大多数生产环境使用 OPcache 缓存编译后的 PHP 代码,修改代码后,需要让 OPcache 失效缓存:

方案 E:通过脚本触发 OPcache 刷新(无需重启)

// opcache_refresh.php
$status = opcache_get_status();
foreach ($status['scripts'] as $file => $info) {
    if (str_contains($file, '/your_project/')) {
        opcache_invalidate($file, true); // true = 强制失效
    }
}
echo "OPcache 已刷新\n";

CLI 定时执行

# 每次代码部署后执行
php /path/to/opcache_refresh.php

选择哪种方案?

场景 推荐方案
传统 PHP-FPM kill -USR2systemctl reload
Swoole kill -USR1 或代码内集成文件监控
Workerman php start.php reload
开发环境 监听文件自动重启(watchexec)
OPcache opcache_invalidate() 定向清理

关键提示

  • 修改 php.ini 必须重启 PHP-FPM(热重载无法加载 php.ini 变更)。
  • 生产环境建议将热重载集成到 CI/CD 部署脚本,避免手工操作。

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