swoole 5 中 reload 是平滑重启 worker 进程的核心机制,仅对 worker 进程生效,不中断连接、不关闭端口;需配置 'max_request'=>0、'reload_async'=>true 等参数,并通过向主进程发送 sigusr1 或调用 $server->reload() 触发。

在 Swoole 5 中,reload 是平滑重启 worker 进程的核心机制,它不中断已有连接、不关闭监听端口、也不影响客户端长连接(如 WebSocket 或 HTTP/1.1 keep-alive),但只对 worker 进程生效。关键在于正确配置 + 正确触发,而非依赖自动行为。
确认服务运行模式与 reload 可用性
reload 仅在多进程模式(process 或 thread)下有效,且要求主进程正常运行、worker 进程未卡死。启动前需检查:
- 确保
daemonize => false(开发环境)或通过master_pid文件准确获取主进程 PID(生产环境) - 调用
$server->stats()验证worker_num> 0 且无reload状态挂起 - 避免在
onWorkerStart中执行阻塞操作,否则新 worker 启动失败会导致 reload 卡住
启用 reload 的必要配置项
Swoole 5 默认支持 kill -USR1 触发 reload,但要保障平滑性,需显式设置以下参数:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
-
'max_request' => 0:禁用自动回收,防止 worker 在 reload 前因请求超限被强制退出 -
'reload_async' => true:启用异步 reload,主进程不等待单个 worker 退出,提升整体切换速度 -
'max_wait_time' => 60:设置最长等待时间(秒),超时后强制终止旧 worker,避免 hang 住 -
'dispatch_mode' => 3(推荐):使用抢占式调度,确保新请求优先分发给已就绪的新 worker
触发 reload 的三种可靠方式
reload 必须向 主进程 PID 发送信号,不可作用于 worker 进程:
-
命令行方式:
kill -USR1 $(cat /tmp/swoole.pid)(前提是启动时写入了 PID 文件) -
代码内触发:
$server->reload(),仅在 manager 进程中调用有效,适合配合配置变更逻辑 -
文件监听自动触发:用
inotifywait监控app/目录,变化时执行kill -USR1 $pid
哪些改动能通过 reload 生效?哪些不能?
reload 本质是“替换 worker 进程”,因此只影响每次新 worker 启动时加载的内容:
- ✅ 生效:在
onWorkerStart、onReceive、onMessage中include/require的业务 PHP 文件 - ✅ 生效:通过
Swoole\Runtime::enableCoroutine()开启协程、opcache_reset()清除字节码缓存(需手动加) - ❌ 不生效:
$server->set()中的配置(如worker_num、task_worker_num、heartbeat_idle_time) - ❌ 不生效:全局常量定义、扩展加载、SSL 证书路径等启动期静态配置










