Swoole 4热重载核心是异步平滑重启:需启用reload_async=true和max_wait_time=N,通过$server->reload()或kill -USR1触发,新代码必须在onWorkerStart中动态加载,否则无效。

Swoole 4 的热重载(reload)和平滑重启,核心目标是让代码更新生效的同时,不中断正在处理的请求、不丢弃未完成的异步任务、不强制断开客户端连接。这需要配置项协同 + 信号/方法调用 + 代码结构配合,缺一不可。
关键配置项必须启用
仅调用 reload() 或发 USR1 信号还不够,必须提前设置好以下两个参数:
- reload_async = true:开启异步重启模式。否则 Worker 收到信号后会立即停止接收新请求,正在执行的协程或回调可能被粗暴终止。
- max_wait_time = N(单位:秒):指定 Worker 进程在收到重启指令后,最多等待 N 秒完成当前任务再退出。建议设为 5–30,视业务最长耗时而定;太短可能丢任务,太长影响重启效率。
重启方式选对才有效
不同场景下应选择对应操作方式:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 更新普通业务逻辑(如 HTTP 路由、TCP 处理逻辑)→ 执行
$server->reload()或向主进程发送kill -USR1 $PID - 仅更新 TaskWorker 相关代码(如异步邮件、日志写入)→ 使用
$server->reload(true)或kill -USR2 $PID,避免重启 Worker 影响在线连接 - 彻底关闭服务 → 调用
$server->shutdown()或发kill -15 $PID(SIGTERM),主进程会等待所有 Worker 完成扫尾后退出
代码加载时机决定热更是否生效
reload 不会重新执行整个 PHP 文件,只重启 Worker/Task 进程。因此:
- 类、函数、配置等必须在
onWorkerStart回调中加载(例如require_once、new实例、Config::load()),否则旧版本仍驻留在内存中 - 避免在
onWorkerStart之外(如文件顶部)直接 new 对象或 require 类——这些会在主进程启动时加载一次,reload 后不会刷新 - 使用 Composer autoload 时,确保 autoloader 在
onWorkerStart中重建,或启用opcache.enable_cli=1并配合opcache_invalidate()清理缓存(需谨慎)
常见陷阱与规避建议
实际运维中容易踩坑的地方:
- 守护模式下用非 root 用户执行
kill可能失败(权限不足),建议统一用框架封装命令(如 EasySwoole 的php easyswoole reload) - Base 模式下 reload 会断开所有 TCP 连接(因连接绑定在 Worker 进程),如需零中断,请改用
Process模式 + 自定义进程管理 -
addProcess添加的自定义进程不受 reload 控制,需自行监听信号并在onWorkerStop中优雅退出 - 频繁 reload 可能触发保护机制(如连续两次 reload 间隔太短),建议加锁或限频

















