kill -USR2 pidx(平滑重载work进程)具体做了什么
让 master进程进入“平滑重载(graceful reload)模式”
1. 平滑重启子进程
1 | kill -USR2 $(cat /run/php-fpm.pid) # php-fpm: master process (/usr/local/etc/php-fpm.conf) |
结论:
- 1.master 进程 PID 不变
- 2.worker 全部重建
- 3.重新加载配置
- 4.OPcache 重新初始化
- 5.已有请求不被中断
gracefull 优雅不过时
2. PHP-FPM 对 USR2 的官方语义
2.1 信号与行为映射
| 信号 | 行为 |
|---|---|
SIGTERM |
立即停止(粗暴) |
SIGINT |
立即停止 |
SIGQUIT |
优雅停止 |
SIGHUP |
重载配置(旧版行为不稳定) |
SIGUSR2 |
平滑 reload(推荐) |
3. USR2 到底“动了谁”
3.1 进程级别拆解
flowchart TD
M[php-fpm master PID=100] --> W1[worker 101]
M --> W2[worker 102]
M --> W3[worker 103]
subgraph USR2 信号
M -->|reload| N[新 worker 池]
end
W1 -->|处理完请求后退出| X1[exit]
W2 -->|处理完请求后退出| X2[exit]
W3 -->|处理完请求后退出| X3[exit]
3.2 发生的事情
master 收到 USR2
master:
- 重新解析
php.ini / opcache.ini / pool.conf - fork 新一批 worker
- 重新解析
老 worker:
- 继续处理正在执行的请求
- 请求结束后退出
新 worker:
- 加载新代码
- 重新初始化 OPcache
4. 为什么 USR2 能刷新 OPcache
4.1 OPcache 生命周期关键点
- OPcache 是 进程内共享内存
- 由 worker 初始化
- worker 退出 = opcode 消失
所以:
| 动作 | OPcache 是否重建 |
|---|---|
| 改 PHP 文件 | ❌ |
| reload worker(USR2) | ✔ |
| restart php-fpm | ✔ |
| opcache_reset() | ✔ |
5. 如何验证「master 没重启」
5.1 看 PID 是否变化
1 | cat /run/php-fpm.pid |
执行 USR2 后:
- master PID 不变
- worker PID 全换
6. Docker 场景下操作
6.1 推荐方式(最干净)
1 | docker kill -s USR2 php-fpm-container #php-fpm-master进程 |
7. 总结
USR2 是 PHP-FPM 的“热重载”,不是重启 master,而是滚动替换 worker。
用它发布代码,是对性能、可用性、心态都最友好的方式。