本文目录导读:

- 传统 PHP(PHP-FPM + Nginx/Apache)
- 常驻内存框架(Swoole / Workerman)
- 开发环境(本地调试)
- 终极方案:OpCache 热更新(生产环境推荐)
- 总结:选择哪种方案?
在 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 -USR2 或 systemctl reload |
| Swoole | kill -USR1 或代码内集成文件监控 |
| Workerman | php start.php reload |
| 开发环境 | 监听文件自动重启(watchexec) |
| OPcache | opcache_invalidate() 定向清理 |
关键提示:
- 修改
php.ini必须重启 PHP-FPM(热重载无法加载 php.ini 变更)。 - 生产环境建议将热重载集成到 CI/CD 部署脚本,避免手工操作。