当前位置: 首页 > news >正文

PHP Swoole 启动时的进程关系

PHP Swoole 启动时的进程关系可以分为以下层次结构,各进程协作高效处理高并发请求:

1. Master 进程(主进程)

  • 角色:负责网络事件监听(如端口监听)、管理 Reactor 线程及协调进程间通信。
  • 线程模型
    • 包含多个 Reactor 线程(默认数量与 CPU 核数相同),处理连接/数据接收等 I/O 事件。
    • 通过多线程实现高并发连接处理,将请求分发给 Worker 进程。
  • 特点:常驻内存,不处理具体业务逻辑,仅负责事件分发。

2. Manager 进程(管理进程)

  • 角色:由 Master 进程创建,负责 Worker/Task 进程的生命周期管理。
  • 职责
    • 根据配置(worker_numtask_worker_num)创建并监控 Worker 和 Task Worker 进程。
    • 在 Worker 异常退出时自动重启新进程,保障服务稳定性。
  • 通信方式:通过 Unix 信号或管道与 Worker 进程通信。

3. Worker 进程(工作进程)

  • 角色:处理具体业务逻辑(如 HTTP 请求、WebSocket 消息)。
  • 特点
    • 数量由 worker_num 配置,独立处理请求(进程隔离,避免互相阻塞)。
    • 默认为同步阻塞模式,可通过协程或异步回调实现非阻塞操作。
  • 生命周期:由 Manager 进程创建和回收,支持热重启(代码更新后重启 Worker 而不中断服务)。

4. Task Worker 进程(异步任务进程)

  • 角色:专门处理耗时任务(如数据库写入、文件处理),避免阻塞主业务逻辑。
  • 配置:通过 task_worker_num 指定数量,独立于普通 Worker。
  • 通信:Worker 进程通过 task() 方法投递任务,Task Worker 异步处理并返回结果。

进程关系树

Master Process (主进程,管理 Reactor 线程)
│
├── Manager Process (管理进程,监控 Worker)
│   │
│   ├── Worker Processes (普通工作进程,数量=worker_num)
│   │
│   └── Task Worker Processes (异步任务进程,数量=task_worker_num)
│
└── Reactor Threads (多个线程,处理网络 I/O)

关键协作机制

  • 事件分发:Master 的 Reactor 线程监听到事件后,将请求分配给 Worker 进程处理。
  • 进程隔离:Worker 崩溃不影响 Master/Manager,由 Manager 自动重启新进程。
  • 热重启:通过 kill -USR1 MasterPID 触发,仅重启 Worker 进程以加载新代码。
  • 数据共享:通过 Swoole\Table、Atomic 或 Redis 等外部存储,避免进程间直接内存共享。

配置示例(Server 初始化)

$server = new Swoole\Http\Server("0.0.0.0", 9501);
$server->set([
    'worker_num' => 4,       // 4 个 Worker 进程
    'task_worker_num' => 2, // 2 个 Task Worker
    'daemonize' => false,   // 非守护进程(调试时建议关闭)
]);

流程图:请求处理过程

  1. 客户端请求 → Master 的 Reactor 线程接收。
  2. Reactor 线程 → 将请求分发给空闲 Worker。
  3. Worker 进程 → 处理业务逻辑,若需异步任务,调用 task() 投递给 Task Worker。
  4. Task Worker → 处理完成后,结果返回给 Worker。
  5. Worker → 发送响应给客户端。

此架构充分利用多核 CPU,通过多进程避免单点阻塞,结合异步非阻塞 I/O 提升性能,适用于高并发场景如实时推送、微服务等。

相关文章:

  • ISIS报文
  • ES6 新特性全面总结
  • 26考研|高等代数:线性空间
  • 关于CodeJava的学习笔记——10
  • 医院信息系统与AI赋能的介绍
  • 【Easylive】获取request对象的两种方式
  • windows 下 通过虚拟化拦截对一个text.txt文件的访问 如果要打开的文件名为 text.txt 提示无权限
  • MySQL in和exists的取舍
  • 批量清空或者删除 PDF 文档中作者、创建程序、修改时间等元数据
  • 【Easylive】application.yml文件中都是什么作用
  • Day78 | 灵神 | 反转链表 两两交换链表中的节点
  • 每天学一个 Linux 命令(9):useradd/userdel
  • EDI传输中的OFTP AS2
  • 【模拟CMOS集成电路设计】电荷泵(Charge bump)设计与仿真(示例:栅极开关CP+轨到轨输入运放+基于运放CP)
  • CentOS 7 安装 Kubernetes 1.28.2 集群
  • 企业如何构建风控合规体系?
  • LLM - 推理大语言模型 DeepSeek-R1 论文简读
  • python接口自动化测试:接口数据依赖
  • 蓝桥杯备考---》贪心算法之矩阵消除游戏
  • 理解Java数据库编程之JDBC
  • 找网站公司做网站/昆明装饰企业网络推广
  • 企业注册阿里账号网站建设/网页设计规范
  • 免费网站建设策划/国内重大新闻10条
  • 深圳最大的手机市场在什么地方/一个网站的seo优化有哪些
  • 网站开发一般多少钱/郑州网站优化seo
  • 重庆 企业网站建设/西安网是科技发展有限公司