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 发生的事情

  1. master 收到 USR2

  2. master:

    • 重新解析 php.ini / opcache.ini / pool.conf
    • fork 新一批 worker
  3. 老 worker:

    • 继续处理正在执行的请求
    • 请求结束后退出
  4. 新 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
2
cat /run/php-fpm.pid
ps -o pid,ppid,cmd -C php-fpm

执行 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。
用它发布代码,是对性能、可用性、心态都最友好的方式。