Swoole启动后严格按Master→Manager→Worker/TaskWorker三级进程树初始化,协程调度器仅在Worker进程内生效;Master不执行业务代码,onStart中不可用协程,所有业务初始化须在onWorkerStart中完成。

Master 进程只做调度,不碰业务代码
Master 进程是 Swoole 的“总控台”,它不加载任何 PHP 业务逻辑,也不执行 onRequest、onReceive 等回调。它的唯一职责是 fork 子进程、监听信号(如 SIGTERM)、转发信号给 Manager,并在 Worker 异常退出时拉起新进程。
常见错误现象:
- 在
onStart回调里写耗时初始化(如加载大配置、连 Redis),以为只执行一次 —— 实际上onStart是在 Master 进程中触发的,但此时 PHP 环境尚未完整加载,require可能失败,或引发Class not found - 试图在
onStart中启动协程:go(...)会直接报错,因为 Master 进程未启用协程运行时
正确做法:
- 所有业务类加载、框架初始化、连接池预热,必须放在
onWorkerStart中 -
onWorkerStart每个 Worker 进程各执行一次,且此时已具备完整 PHP 上下文与协程能力 - 若需全局仅一次的初始化(如共享内存
Swoole\Table创建),应在onManagerStart中完成
Worker 进程才是协程调度的唯一载体
协程调度器(Coroutine Scheduler)只存在于每个 Worker 进程内部,且默认不自动开启 —— 必须显式调用 Swoole\Coroutine::create()、go() 或包裹在 Swoole\Coroutine\run() 中才能激活。
关键事实:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
-
onRequest回调本身不在协程环境里运行,除非你手动用go()包裹业务逻辑,或提前在onWorkerStart中调用Swoole\Runtime::enableCoroutine() - 一个 Worker 进程内可同时运行成百上千个协程,但它们共享该进程的内存空间(包括
static、global、$_SERVER),不共享栈 - 协程切换只发生在被 Hook 的 I/O 点(如
Co\MySQL->query()、Co\Http\Client->get()),而非任意位置
容易踩的坑:
- 在
onRequest里直接写sleep(1):整个 Worker 卡死 1 秒,所有并发请求排队 —— 必须改用Co::sleep(1) - 用
file_get_contents('http://...')发起 HTTP 请求:默认不走协程,需先启用Swoole\Runtime::enableCoroutine(SWOOLE_HOOK_FILE),否则等同于阻塞调用 - 在协程里复用非协程安全的 PDO 实例:PDO 默认不支持并发读写,应改用
Co\MySQL或连接池封装
TaskWorker 不是协程替代品,而是阻塞操作的隔离区
TaskWorker 进程不启用协程调度器,它是同步、单线程、阻塞式执行环境。它的存在意义只有一个:把无法协程化(或暂时不想改造)的阻塞操作(如 Excel 导出、图像处理、调用未 Hook 的 C 扩展)从 Worker 中剥离出来,避免拖垮整个并发能力。
使用前提:
- 必须显式设置
task_worker_num > 0,否则$server->task()会直接失败 -
onTask回调中禁止调用任何协程函数(如go()、Co::sleep()),会触发致命错误 - TaskWorker 与 Worker 之间通过共享内存或序列化数据通信,不能直接传递资源句柄(如
mysqli实例、文件指针)
典型误用场景:
- 为“保险起见”把所有 DB 查询都扔进 TaskWorker:反而因进程间通信开销和上下文切换损失性能,应优先用
Co\MySQL+ 连接池 - 在
onTask中调用curl_exec()却未启用Swoole\Runtime::enableCoroutine():无效,TaskWorker 不支持协程 Hook - 期望 TaskWorker 能访问 Worker 中定义的
static $config:不行,进程隔离,必须通过$server->task()显式传参或查Swoole\Table

















