stop()作用于单个Worker进程,立即退出且不释放资源;shutdown()是主进程发起的全局优雅终止,停止新连接、等待旧连接处理完毕并释放全部资源。

stop 和 shutdown 都能终止 Swoole 5 Server,但作用对象、触发时机和行为逻辑完全不同——不是“轻重之分”,而是“进程层级之别”。
stop():Worker 进程级退出
调用 $server->stop($workerId) 仅影响指定的 Worker(或全部 Worker),不触碰主进程与 Manager 进程。
- 只在 Worker 进程内有效,主进程或 Manager 进程中调用无效
- 触发
onWorkerStop回调,之后该 Worker 进程立即退出 - 不会关闭监听端口,不释放资源,也不等待连接完成
- 常用于动态缩容、故障隔离或单个 Worker 异常时手动摘除
shutdown():全服务优雅终止
调用 $server->shutdown() 是主进程发起的全局终止动作,需在 Worker 或 Manager 进程中执行(推荐在 Manager 中)。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 停止接受新连接,但允许已建立连接继续处理完当前请求
- 等待所有活跃连接 close 或超时,再关闭监听 socket
- 依次终止 Worker、Task、Timer 等所有子进程/线程
- 最后调用
onShutdown回调(注意:此时已无协程环境,需手动Co\run()才能用协程 API)
信号方式才是生产环境标准操作
代码中直接调用 stop() 或 shutdown() 适合调试或特定控制逻辑;线上必须依赖信号机制:
-
kill -TERM $master_pid→ 触发完整 shutdown 流程(等价于shutdown()效果) -
kill -USR1 $master_pid→ 热重启 Worker,连接不中断(非关闭) - 绝不可用
kill -9,会导致连接强制断开、协程上下文丢失、日志截断
怎么选?看目标
想让某个 Worker 下线修 bug?用 stop($workerId)。
想整站下线做维护或升级?发 SIGTERM,走 shutdown 全流程。
想更新代码又不让用户感知?用 USR1 热 reload。

















