Workerman 4.0.34采用主从多进程架构:主进程仅负责fork、信号监听与子进程监控,子进程独立运行事件循环并直连端口;通过SO_REUSEPORT实现内核级连接均衡,内置状态机(STATUS_STARTING→RUNNING→SHUTDOWN)保障平滑启停,异常时主进程1秒内自动拉起新Worker。

要真正理解 Workerman 4.0.34 的多进程架构,必须从进程启动时的父子关系、状态流转、连接分发机制和异常恢复路径四个维度切入——它不是简单地 fork 出几个子进程,而是一套有主控权、有状态机、有容错策略的闭环系统。
主进程与子进程的初始化分工
启动 Worker::runAll() 后,Workerman 首先创建一个主进程(Master),该进程不处理任何网络 I/O,只做三件事:监听信号、fork 子进程、监控子进程存活状态。
子进程(Worker)由主进程通过 pcntl_fork() 创建,每个子进程独立调用 eventLoop->run() 进入事件循环,各自绑定同一端口(Linux 下通过 SO_REUSEPORT 实现,无需主进程代理转发)。
【主进程绝不监听连接,也不参与业务逻辑处理】——这是 Workerman 稳定性的根基。一旦你在 $worker->onMessage 中写数据库阻塞操作,只会影响当前 Worker 进程,其他进程照常服务。
连接分配与负载均衡策略
Workerman 4.0.34 默认启用内核级负载均衡(SO_REUSEPORT),由操作系统内核决定哪个 Worker 进程接收新连接,不再依赖主进程轮询分发。
方法一:启用 SO_REUSEPORT(推荐且默认)
只需确保 PHP 运行环境为 Linux 内核 3.9+,Workerman 自动检测并启用。无需额外配置,连接天然均匀分布到各 Worker。
方法二:禁用 SO_REUSEPORT 后回退至主进程分发
在非 Linux 环境或内核过旧时,主进程会监听端口,accept 到连接后,通过 Unix Socket 将 socket fd 传递给空闲 Worker。此时需注意:【若某个 Worker 进程长时间阻塞,会导致主进程分发队列积压,甚至触发连接超时】。
Worker 进程状态机与生命周期控制
第一步:Worker 进程启动后进入 STATUS_STARTING 状态,执行 $worker->onWorkerStart 回调;
第二步:回调执行完毕,状态切换为 STATUS_RUNNING,开始监听事件循环;
第三步:收到 SIGTERM 或执行 php start.php stop 时,主进程向所有 Worker 发送 SIGUSR2 信号,Worker 进入 STATUS_SHUTDOWN,拒绝新连接,但继续处理已有连接和缓冲区数据;
第四步:所有连接 close 完毕后,Worker 调用 $worker->onWorkerStop 并退出进程。
这个状态机全程受主进程跟踪,任意 Worker 异常退出(如段错误、未捕获异常),主进程会在 1 秒内检测到并立即 fork 新进程补位,新进程从 STATUS_INITIAL 重新走一遍流程。
进程间通信与共享数据方案
Workerman 本身不提供内存级共享变量,因为进程隔离是稳定性前提。跨进程通信必须显式选择以下任一方式:
Redis 方案:适用于计数器、会话同步、广播消息等高频读写场景,性能可靠,部署简单。
Channel 组件方案:基于 Unix Socket + 序列化实现,轻量级,适合小规模通知(如“某用户已下线”,需广播给其他 Worker)。调用前必须先执行 Channel::getInstance()->connect(),否则会静默失败。
文件/数据库方案:仅适合低频、非实时场景(如配置热更新),避免频繁 IO 拖慢 Worker 事件循环。

















