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]分别存储一个文件描述符