平滑重启这事儿,听起来简单,但实际操作中不少人栽了跟头。它可不是主进程发个信号就完事了,而是需要逐一向worker进程发出通知,等它们处理完当前请求再优雅退出,然后新worker加载更新后的代码接替上岗。这里有个关键前提:你的业务代码必须在onWorkerStart回调里加载,否则改了也是白改,信号发过去根本没反应。

平滑重启不是“发个信号就完事”,而是主进程逐个通知 worker 处理完当前请求再退出,新 worker 加载新代码接替——前提是你的业务代码必须在 onWorkerStart 之后加载,否则改了也白改。

为什么 kill -USR1 有时不生效?

这个问题问得最多。常见场景是:改了代码,发个kill -USR1 $pid,结果日志没刷新,onWorkerStart没重跑,旧逻辑还在那里坚挺地执行。问题出在哪?

reload_async 和 max_wait_time 怎么配才不丢请求?

这两个参数直接影响平滑程度和资源回收节奏,但可不是设得越大越稳。有不少人把 max_wait_time 设成 300 秒,结果旧进程占着端口不放,新 worker 启动不了,整个服务反而卡住了。

如何确认重启真的“平滑”?

不能只看进程 PID 变了就万事大吉,得实际验证服务连续性。这里有几个实用方法:

真正容易被忽略的是:Swoole 的 reload 只能更新 worker 进程的用户代码,Master 进程、Manager 进程、Task 进程的代码和配置都无法热更新。一旦涉及 server->set() 参数变更(如 worker_numtask_worker_num)、PHP 版本升级、扩展变动,就必须停机重启主进程——这时候就得靠蓝绿部署或滚动发布兜底了。

本文转载于:https://www.php.cn/faq/2823708.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。