文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Swoole server的案例分析

2023-06-08 01:51

关注

这篇文章将为大家详细讲解有关Swoole server的案例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一. 基础知识

1.1 Swoole

Swoole是面向生产环境的php异步网络通信引擎, php开发人员可以利用Swoole开发出高性能的server服务。Swoole的server部分, 内容很多, 也涉及很多的知识点, 本文仅对其server进行简单的概述, 具体的实现细节在后续的文章中再进行详细介绍。

推荐(免费):swoole

1.2 网络编程

网络通信是指在一台(或者多台)机器上启动一个(或者多个)进程, 监听一个(或者多个)端口, 按照某种协议(可以是标准协议http, dns; 也可以是自行定义的协议)与客户端交换信息。

目前的网络编程多是在tcp, udp或者更上层的协议之上进行编程。Swoole的server部分是基于tcp以及udp协议的。

利用udp进行编程较为简单, 本文主要介绍tcp协议之上的网络编程

TCP网络编程主要涉及4种事件

连接建立: 主要是指客户端发起连接(connect)以及服务端接受连接(accept)

消息到达: 服务端接受到客户端发送的数据,该事件是TCP网络编程最重要的事件,服务端对于该类事件进行处理时, 可以采用阻塞式或者非阻塞式,除此之外, 服务端还需要考虑分包, 应用层缓冲区等问题

消息发送成功: 发送成功是指应用层将数据成功发送到内核的套接字发送缓冲区中,并不是指客户端成功接受数据。对于低流量的服务而言,数据通常一次性即可发送完,并不需要关心此类事件。如果一次性不能将全部数据发送到内核缓冲区,则需要关心消息是否成功发送(阻塞式编程在系统调用(write, writev, send等)返回后即是发送成功, 非阻塞式编程则需要考虑实际写入的数据是否与预期一致)

连接断开: 需要考虑客户端断开连接(read返回0)以及服务端断开连接(close, shutdown)

tcp建立连接的过程如下图

Swoole server的案例分析

● 图中, ACK、SYN表示标志位, seq、ack为tcp包的序号以及确认序号

tcp断开连接的过程如下图

Swoole server的案例分析

● 上图考虑的是客户端主动断开连接的情况, 服务端主动断开连接也类似

● 图中, FIN、ACK表示标志位, seq、ack为tcp包的序号以及确认序号

1.3 进程间通信

进程之间的通信有无名管道(pipe), 有名管道(fifo), 信号(signal), 信号量(semaphore), 套接字(socket), 共享内存(shared memory)等方式

Swoole中采用unix域套接字(套接字的一种)用于多进程之间的通信(指Swoole内部进程之间)

1.4 socketpair

socketpair用于创建一个套接字对, 类似于pipe, 不同的是pipe是单向通信, 双向通信需要创建两次, socketpair调用一次即可实现双向通信, 除此之外, 由于使用的是套接字, 还可以定义数据交换的方式

socketpair系统调用

Swoole server的案例分析

1.5 守护进程(daemon)

守护进程是一种特殊的后台进程, 它脱离于终端, 用于周期性的执行某种任务

进程组

会话

创建守护进程的方式

1.6 Swoole tcp server示例

Swoole server的案例分析

二. Swoole server


2.1 base模式

说明

启动过程

2.2 process模式

说明

启动过程

Swoole server的案例分析

Swoole server的案例分析

主进程pthread_create出react线程, 主线程和react线程各自进入自己的事件循环, reactor线程执行static int swRea-torThread_loop (swThreadParam *param), 等待处理事件

Swoole server的案例分析

结构图

Swoole server的案例分析

上图并没有考虑task_worker进程, 在默认情况下, task_worker进程数为0

三. 请求处理流程(process模式)


3.1 reactor线程与worker进程之间的通信

Swoole master进程与worker进程之间的通信如下图所示

Swoole server的案例分析

假设reactor线程有2个, worker进程有3个, 则reactor与worker之间的通信如下图所示

Swoole server的案例分析

reactor线程与worker进程通信的数据包

Swoole server的案例分析

3.2 请求处理

master进程中的主线程负责监听端口(listen), 接受连接(accept, 产生一个fd), 接受连接后将请求分配给reactor线程, 默认通过fd % reactor_number进行分配, 之后通过epoll_ctl将fd加入到对应reactor线程中, 刚加入时监听写事件, 因为新接受连接创建的套接字写缓冲区为空, 故而一定可写, 会被立刻触发, 进而reactor线程进行一些初始化操作

Swoole server的案例分析

reactor线程中fd的写事件被触发, reactor线程负责处理, 发现是首次加入, 没有数据可写, 则会开启读事件监听, 准备接受客户端发送的数据

reactor线程读取到用户的请求数据, 一个请求的数据接收完后, 将数据转发给worker进程, 默认是通过fd % worker_number进行分配

worker进程收到reactor发送的数据包后, 进行处理, 处理完成后, 将请求结果发送给主进程

主进程收到worker进程发送的数据包, 这个会触发某个reactor线程进行处理

reactor线程处理worker进程发送的请求处理结果, 如果是直接发送数据给客户端, 则可以直接发送, 如果需要改变这个这个连接的监听状态(例如close), 则需要先找到监听这个连接的reactor线程, 进而改变这个连接的监听状态(通过调用epoll_ctl)

四. gdb调试

4.1 process模式启动

Swoole server的案例分析

4.2 base模式启动

Swoole server的案例分析

五. 总结及思考

本文主要介绍了Swoole server的两种模式: base模式、process模式, 详细讲解了两种模式的网络编程模型, 并重点介绍了process模式下, 进程间通信的方式、请求的处理流程等

process模式下, 为什么不直接在主进程中创建多个线程, 由线程直接进行处理请求(可以避免进程间通信的开销), 而是创建出manager进程, 再由manager进程创建出worker进程, 由worker进程处理请求?

process模式下, 主进程中的每个reactor线程都可以同时处理多个请求, 多个请求是并发处理的, 我们从2个维度看

使用Swoole创建tcp server时, 由于tcp是字节流的协议, 需要分包, 而Swoole在不清楚客户端与服务端通信协议的情况下, 无法进行分包, process模式下, reactor交给worker进程的数据也只能是字节流的, 需要用户自行处理。当然, 一般情况也不需要自行构建协议, 使用tcp server, Swoole已经支持Http, Https等协议

关于“Swoole server的案例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯