onmanagerstart 和 onmanagerstop 是仅在 manager 进程内执行的回调:前者为 manager 启动后首次执行的入口点,用于初始化日志、信号等资源;后者为 manager 终止前最后一次可执行逻辑的位置,但触发条件严苛,不可依赖做关键清理。

onManagerStart 和 onManagerStop 是 Swoole 中仅在 Manager 进程内执行的两个回调,它们不共享状态、不跨进程、也不在 Worker 或 Master 进程中触发。关键区别在于:前者是 Manager 进程启动后**第一次**执行的入口点,后者是 Manager 进程**终止前最后一次**可执行业务逻辑的位置。
onManagerStart 只在 Manager 进程启动时触发一次
这个回调发生在 Manager 进程 fork 出来之后、但尚未开始创建 Worker/Task 进程之前。此时:
-
onManagerStart回调函数运行在 Manager 进程上下文中,$server对象不可用(它只在 Master/Worker 进程中有效) - 可以安全地初始化 Manager 自身需要的资源,比如打开日志文件、监听信号、启动子守护进程(如健康检查脚本)
- 不能调用
$server->task()、$server->send()等方法——这些操作依赖 Worker 进程或网络栈,此时还未就绪 - 常见误用:试图在这里修改
$server->setting或调用$server->reload(),会静默失败或报错Call to a member function xxx() on null
onManagerStop 在 Manager 进程退出前执行,但时机很窄
这个回调只会在 Manager 进程收到 SIGTERM 或因异常即将退出时触发,且必须满足两个条件才真正执行:
- Manager 进程尚未释放所有子进程(Worker/Task 还在运行中)
- 回调注册了,并且未被提前 unset
实际场景中它很少被可靠触发,原因包括:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 如果 Master 进程先挂了(比如被
kill -9),Manager 会随父进程一起被系统回收,onManagerStop不会执行 - Manager 异常崩溃(如段错误)时,不会走正常退出流程,该回调跳过
- 多数运维操作(如
kill -USR2reload)不终止 Manager,只是重启 Worker,所以也不会触发onManagerStop
因此,不要依赖它做关键清理(如关闭数据库连接、写入 final log),更适合做轻量标记,例如:
file_put_contents('/tmp/manager_stopped', date('c'), FILE_APPEND);
为什么不能用 onStart/onWorkerStart 替代它们
这三个回调分属不同进程,作用域完全隔离:
-
onStart在 Master 进程中执行,无法访问 Manager 的 PID 或其私有资源 -
onWorkerStart在每个 Worker 进程中独立执行,次数 =worker_num,和 Manager 生命周期无直接关系 -
onManagerStart/onManagerStop是唯一能感知 Manager 启停的钩子,但仅限于 Manager 自身上下文——比如你用pcntl_fork()在 Manager 内启了一个子进程,就只能靠这两个回调来管理它的生命周期
真正容易被忽略的一点:Swoole 默认不会打印 Manager 进程的错误日志,onManagerStart 中的 echo 或未捕获异常会直接丢弃,调试时务必配合 error_log() 或写入独立文件,否则你会以为回调根本没跑。










