onStart在Master进程主线程执行且仅一次,仅允许日志输出、echo和修改进程名;onWorkerStart在每个Worker/Task进程启动时各执行一次,两者并发无依赖,是业务初始化的正确入口。

onStart 在 Master 进程中执行,只运行一次;onWorkerStart 在每个 Worker(含 Task)进程启动时各执行一次,且两者完全并发、无先后依赖。
onStart 只能干三件事:打日志、echo、改进程名
它发生在 Master 进程刚 fork 出 Manager 之后、但 Worker 还没创建之前。此时不能连接数据库、不能加载框架、不能初始化任何需要长期存活的资源——因为这些资源在 Master 进程里建了,Worker 进程也拿不到。
- 错误写法:
$this->redis = new Redis();或require 'vendor/autoload.php';放在onStart里 - 正确用途:
echo "Server started at " . date('Y-m-d H:i:s') . "\n";、swoole_set_process_name('myapp-master'); - BASE 模式下
onStart根本不触发(因为没 Master 进程)
onWorkerStart 是业务初始化的真正入口
每个 Worker 进程(包括 task_worker_num 配置的 Task 进程)启动时都会独立执行一次 onWorkerStart,传入的 $worker_id 是从 0 开始的逻辑 ID,不是 OS PID。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 这里可以安全地初始化数据库连接池、Redis 实例、框架容器(如 Hyperf 的
ApplicationContext) - 注意判断进程类型:
if ($server->taskworker) { /* 是 Task 进程 */ } else { /* 是普通 Worker */ } - 若配置了
worker_num=4和task_worker_num=2,则共触发 6 次onWorkerStart,$worker_id范围是 0~5
并发执行 ≠ 可互相等待
onStart 和所有 onWorkerStart 是由 Swoole 内部并行触发的,没有任何同步机制。你不能在 onWorkerStart 里等 onStart 做完某件事,也不能反过来。
- 常见误判:
if (defined('MASTER_READY')) { ... }这类标志位无效,因为进程内存不共享 - 跨进程通信必须走
swoole_process、msgqueue、redis等显式 IPC 方式 - 想让某个初始化动作“只做一次”,得用文件锁、Redis SETNX 或原子计数器,而不是靠回调顺序
最容易被忽略的是:Task 进程也走 onWorkerStart,但它不处理网络请求,只收任务。如果你在 onWorkerStart 里无差别初始化 HTTP 客户端或 WebSocket server,Task 进程会白占内存还可能报错。

















