swoole 4.x 默认采用多进程+多线程协同架构,不可切换为纯进程或纯线程模式;worker进程执行php业务逻辑,reactor线程负责网络io,manager与master进程固定存在,taskworker为专用多进程,协程才是核心并发单元。

Swoole 4.x 的“多进程”和“多线程”不是并列可选的两种运行模式,而是天然混合、分工明确的架构设计——它默认就是多进程 + 多线程协同工作,不能简单切换成纯线程或纯进程模型。关键在于理解各组件角色与配置入口,而非“选模式”。
Worker 进程数决定业务并发能力
Worker 进程是执行 PHP 业务逻辑的地方(比如 onReceive 回调),每个 Worker 是独立的 PHP 进程,互不共享内存。
- 默认值:等于 CPU 核心数(
swoole_cpu_num()) - 配置方式:
$server = new Swoole\Http\Server('0.0.0.0', 9501); $server->set([ 'worker_num' => 8, // 启动 8 个 Worker 进程 'task_worker_num' => 4, // 启动 4 个 TaskWorker 进程(可选) ]); - 注意:
worker_num不宜远超 CPU 核心数,否则上下文切换开销上升;若业务含大量阻塞操作(如同步 MySQL 查询),可适当增加,但更推荐改用协程或异步客户端。
Reactor 线程由 Master 进程管理,不可直接配置数量
Reactor 线程负责网络 IO(accept、read、write、协议解析),运行在 Master 进程内,完全用 C 实现,不执行 PHP 代码。
- 线程数默认 = CPU 核心数(Linux 下基于
epoll) - 无法通过
server->set()修改线程数,但可通过环境变量间接影响:SWOOLE_REACTOR_NUM=6 php server.php # 强制设置 Reactor 线程数(部分版本支持)
- 更稳妥的做法是让 Swoole 自动适配:它会根据 CPU 数动态创建,通常无需干预。
Manager 进程和 Master 进程固定存在,不参与配置
- 总是 1 个 Master 进程(含 Reactor 线程组)
- 总是 1 个 Manager 进程(负责 fork / 重启 Worker/TaskWorker)
- 它们不执行业务逻辑,也不暴露配置项,属于底层调度中枢。
TaskWorker 是同步阻塞的专用进程,非“线程”
TaskWorker 用于处理耗时任务(如发邮件、写日志、调用第三方 API),它:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 以多进程方式运行(不是线程)
- 每个 TaskWorker 是独立进程,同步阻塞执行
onTask回调 - 与 Worker 之间通过 Unix Socket 通信(高效 IPC)
- 启用方式仅需设置
task_worker_num,无需额外开启“多线程开关”
协程才是 Swoole 4+ 的核心并发单元
Swoole 4.x 起,官方推荐用协程替代回调编程:
- 每个请求自动分配一个协程(轻量、用户态、无系统调用开销)
- 所有协程共享同一个 Worker 进程的内存空间
- 支持
co::sleep、Swoole\Coroutine\MySQL、Http\Client等协程化 API - 无需手动配置“协程数”,它随请求动态创建销毁
例如:
$server->on('request', function ($request, $response) {
// 这里已在协程中运行
$mysql = new Swoole\Coroutine\MySQL();
$mysql->connect(['host' => '127.0.0.1']);
$result = $mysql->query('SELECT * FROM users LIMIT 1');
$response->end(json_encode($result));
});
不复杂但容易忽略









