php-fpm动态模式下平滑重启需满足三前提:pid文件正确配置、process_control_timeout非零、worker健康;执行kill -usr2触发新旧worker并存轮换,确保请求不中断、配置生效、进程pid不变。

PHP-FPM 动态子进程的平滑重启,核心在于不中断正在处理的请求,同时完成配置重载、二进制模块更新和 worker 进程轮换。它不是简单 kill 再 start,而是依赖信号机制与主从进程协作,尤其在 pm = dynamic 模式下需额外注意资源协调与超时控制。
平滑重启的前提条件
要真正实现“高可用”级的平滑重启,必须满足以下三点:
- master 进程已正确生成 PID 文件(如
/usr/local/php/var/run/php-fpm.pid),且路径在php-fpm.conf中通过pid = ...显式配置 -
process_control_timeout参数不为 0(例如设为10s),否则 USR2 信号会被忽略,导致无法触发平滑重载 - worker 进程处于健康状态,无长期阻塞或僵死进程;否则新 worker 启动后,旧进程可能迟迟不退出,拖长切换窗口
执行平滑重启的正确命令
推荐使用基于 PID 文件的信号发送方式,避免手动查进程号出错:
-
平滑重启(重载配置 + 重启所有 worker):
kill -USR2 $(cat /usr/local/php/var/run/php-fpm.pid) -
仅重开日志文件(不重启进程):
kill -USR1 $(cat /usr/local/php/var/run/php-fpm.pid) -
优雅终止 master(等待 worker 处理完请求后退出):
kill -QUIT $(cat /usr/local/php/var/run/php-fpm.pid)
注意:USR2 是唯一能触发“动态子进程整体轮换”的信号——master 会 fork 新 worker,逐步用新进程替代旧进程,期间旧 worker 继续服务未完成请求,新请求由新 worker 接管。
验证是否真正平滑完成
不能只看进程数是否恢复,要确认三个层面:
-
进程状态:执行
ps aux | grep php-fpm,应看到新旧 worker 并存一段时间,随后旧进程逐个消失;master 进程 PID 不变 -
配置生效:修改
php.ini或www.conf中某项(如max_execution_time),重启后访问phpinfo()页面确认值已更新 -
请求连续性:在重启瞬间持续发起 HTTP 请求(如用
ab -n 1000 -c 50 http://your-site/),检查返回码是否全为 200,无 502 或连接拒绝
动态模式下的关键参数协同
当 pm = dynamic 时,平滑重启效果受以下参数直接影响:
-
pm.max_children:决定最大并发 worker 数,重启过程中若瞬时并发超限,可能触发 fallback 到 ondemand 行为 -
pm.start_servers和pm.min_spare_servers:影响新 worker 启动速度;建议二者设为相近值,避免重启后初期响应延迟 -
pm.process_idle_timeout(PHP 8.0+):空闲 worker 超时回收时间,过短会导致重启后 worker 数快速回落,影响突发流量承接
这些参数需结合业务峰值 QPS 和平均响应时间做压测调优,而非静态套用默认值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











