php实现平滑重启
PHP 实现平滑重启的方法
在 PHP 中实现平滑重启通常用于避免服务中断,尤其是在生产环境中。以下是几种常见的方法:
使用 PHP-FPM 的平滑重启
PHP-FPM(FastCGI Process Manager)是管理 PHP 进程的工具,支持平滑重启。
sudo systemctl reload php-fpm
或使用信号:
sudo kill -USR2 $(pgrep php-fpm)
USR2 信号会让 PHP-FPM 重新加载配置并优雅地重启子进程,不会中断正在处理的请求。
使用 Supervisor 管理进程
Supervisor 是一个进程管理工具,可以监控和重启 PHP 进程。
配置 Supervisor 的 supervisord.conf:
[program:php-worker]
command=php /path/to/your/script.php
autostart=true
autorestart=true
stderr_logfile=/var/log/php-worker.err.log
stdout_logfile=/var/log/php-worker.out.log
平滑重启 Supervisor 管理的进程:

sudo supervisorctl restart php-worker
使用 Nginx 和 PHP-FPM 的组合
Nginx 作为反向代理,可以与 PHP-FPM 配合实现平滑重启。
修改 Nginx 配置后,重新加载 Nginx:
sudo systemctl reload nginx
同时重新加载 PHP-FPM:
sudo systemctl reload php-fpm
这样不会中断现有连接,新的请求会使用新的配置。

使用 PCNTL 扩展(仅限 CLI)
在命令行脚本中,可以使用 PHP 的 PCNTL 扩展实现平滑重启。
<?php
declare(ticks = 1);
function handleSignal($signal) {
switch ($signal) {
case SIGUSR1:
// 重新加载配置或重启逻辑
break;
}
}
pcntl_signal(SIGUSR1, 'handleSignal');
while (true) {
// 主循环逻辑
}
通过发送信号触发重启:
kill -SIGUSR1 <pid>
使用 Laravel Horizon(针对 Laravel 应用)
Laravel Horizon 提供了队列 worker 的平滑重启功能。
重启 Horizon:
php artisan horizon:terminate
Horizon 会等待当前任务完成后再重启。
注意事项
- 平滑重启依赖于进程管理工具或信号机制,确保环境支持。
- 在生产环境中,建议先测试平滑重启的效果。
- 对于长时间运行的脚本,确保正确处理信号和资源释放。


