Swoole server浅析

本文深入介绍了Swoole Server的基础知识,包括Swoole作为PHP异步网络通信引擎的角色,TCP网络编程的四个关键事件,进程间通信方式如unix域套接字,以及守护进程的创建。重点讨论了Swoole的base和process模式,解析了process模式下的请求处理流程,涉及reactor线程与worker进程的通信。同时,文章还探讨了为什么采用多进程而非多线程,以及如何处理并发请求和分包问题。最后,给出了调试Swoole Server的方法和参考资料。
摘要由CSDN通过智能技术生成

ps:在看的过程中如果有遇到任何问题可以留言或者到我的学习交流群一起交流学习。

★我的php学习交流社区——【点击加】。群内管理已准备好 整理好的BAT等一线大厂进阶知识体系备好(相关学习资料以及笔面试题)欢迎获取一起晋升

一. 基础知识

1.1 Swoole

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

 

1.2 网络编程

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

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

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

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

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

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

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

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

5. tcp建立连接的过程如下图

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

6. tcp断开连接的过程如下图

 

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

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

 

1.3 进程间通信

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

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

 

1.4 socketpair

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

2. socketpair系统调用

  • 调用成功后sv[0], sv[1]分别存储一个文件描述符
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值