Swoole 源码分析——Client模块之Recv

2018-10-09
阅读 10 分钟
2.8k
客户端接受数据需要指定缓存区最大长度,就是下面的 buf_len,flags 用于指定是否设置 waitall 标志,如果设定了 waitall 就必须设定准确的 size,否则会一直等待,直到接收的数据长度达到 size。

Swoole 源码分析——Client模块之Send

2018-10-09
阅读 9 分钟
2.6k
上一章我们说了客户端的连接 connect,对于同步客户端来说,连接已经建立成功;但是对于异步客户端来说,此时可能还在进行 DNS 的解析,onConnect 回调函数还未执行。

Swoole 源码分析——Client模块之Connect

2018-09-30
阅读 35 分钟
2.7k
swoole_client 提供了 tcp/udp socket 的客户端的封装代码,使用时仅需 new swoole_client 即可。 swoole 的 socket client 对比 PHP 提供的 stream 族函数有哪些好处:

Swoole 源码分析——进程管理 Swoole_Process

2018-09-24
阅读 16 分钟
4.2k
前言 swoole-1.7.2 增加了一个进程管理模块,用来替代 PHP 的 pcntl 扩展。 PHP自带的pcntl,存在很多不足,如 pcntl 没有提供进程间通信的功能 pcntl 不支持重定向标准输入和输出 pcntl 只提供了 fork 这样原始的接口,容易使用错误 swoole_process 提供了比 pcntl 更强大的功能,更易用的 API,使 PHP 在多进程编程方...

Swoole 源码分析——Async 异步事件系统 Swoole_Event

2018-09-23
阅读 22 分钟
3.1k
对于异步的任务来说,Server 端的 master 进程与 worker 进程会自动将异步的事件添加到 reactor 的事件循环中去,task_worker 进程不允许存在异步任务。

Swoole 源码分析——Server模块之OpenSSL(下)

2018-09-22
阅读 31 分钟
3.6k
上一篇文章我们讲了 OpenSSL 的原理,接下来,我们来说说如何利用 openssl 第三方库进行开发,来为 tcp 层进行 SSL 隧道加密

Swoole 源码分析——Server模块之OpenSSL (上)

2018-09-18
阅读 19 分钟
4.3k
自从 Let's Encrypt 上线之后,HTTPS 网站数量占比越来越高,相信不久的未来就可以实现全网 HTTPS,大部分主流浏览器也对 HTTP 网页给出明显的 不安全 标志。

Swoole 源码分析——基础模块之 Pipe 管道

2018-09-13
阅读 12 分钟
3k
管道是进程间通信 IPC 的最基础的方式,管道有两种类型:命名管道和匿名管道,匿名管道专门用于具有血缘关系的进程之间,完成数据传递,命名管道可以用于任何两个进程之间。swoole 中的管道都是匿名管道。

Swoole 源码分析——基础模块之 Channel 队列

2018-09-11
阅读 5 分钟
2.5k
内存数据结构 Channel,类似于 Go 的 chan 通道,底层基于 共享内存 + Mutex 互斥锁实现,可实现用户态的高性能内存队列。Channel 可用于多进程环境下,底层在读取写入时会自动加锁,应用层不需要担心数据同步问题。

Swoole 源码分析——基础模块之 Heap 堆

2018-09-11
阅读 5 分钟
2.3k
heap 中 num 是现有数据堆的数量,size 是数据堆的大小,type 用于确定数据堆是最大堆还是最小堆,nodes 是数据堆的节点。swHeap_node 中 priority 是数据堆的权重,也是数据堆排序的依据,position 是其在数据堆中的位置。

Swoole 源码分析——基础模块之Queue队列

2018-09-09
阅读 6 分钟
2.5k
swoole 的底层队列有两种:进程间通信 IPC 的消息队列 swMsgQueue,与环形队列 swRingQueue。IPC 的消息队列用于 task_worker 进程接受投递消息,环形队列用于 SW_MODE_THREAD 线程模式下 task_worker 接受投递消息的方法。

Swoole 源码分析——Server模块之Signal信号处理

2018-09-02
阅读 18 分钟
3.2k
信号处理是网络库不可或缺的一部分,不论是 ALARM、SIGTERM、SIGUSR1、SIGUSR2、SIGPIPE 等信号对程序的控制,还是 reactor、read、write 等操作被信号中断的处理,都关系着整个框架程序的正常运行。

Swoole 源码分析——Server模块之Timer模块与时间轮算法

2018-08-29
阅读 31 分钟
3.2k
swoole 的 timer 模块功能有三个:用户定时任务、剔除空闲连接、更新 server 时间。timer 模块的底层有两种,一种是基于 alarm 信号,一种是基于 timefd。

Swoole 源码分析——Server模块之TaskWorker事件循环

2018-08-22
阅读 39 分钟
3.5k
task_worker 进程的创建可以分为三个步骤:swServer_create_task_worker 申请所需的内存、swTaskWorker_init 初始化各个属性、swProcessPool_start 创建进程

Swoole 源码分析——Server模块之Stream 模式

2018-08-19
阅读 8 分钟
2.3k
reactor 线程会通过 swReactorThread_dispatch 发送数据,当采用 stream 发送数据的时候,会调用 swStream_new 新建 stream,利用 swStream_send 发送数据。

Swoole 源码分析——Server模块之Worker事件循环

2018-08-19
阅读 39 分钟
3.7k
添加信号处理函数 swSignal_add,SIGTERM 用于结束 server,只需要 running 设置为 0,manager 会逐个杀死 worker 进程;SIGUSR1 用于重载所有的 worker 进程;SIGUSR2 用于重载所有的 task_worker 进程;SIGIO 用于重启已经关闭了的 worker 进程;SIGALRM 用于检测所有的超时请求;

Swoole 源码分析——Server模块之ReactorThread事件循环(下)

2018-08-15
阅读 29 分钟
2k
我们前面说过,swPort_onRead_raw 是最简单的向 worker 进程发送数据包的方法,swoole 会将从客户端接受到的数据包,立刻发送给 worker 进程,用户自己把数据包拼接起来

Swoole 源码分析——Server模块之ReactorThread事件循环(上)

2018-08-14
阅读 34 分钟
2.4k
经过 php_swoole_server_before_start 调用 swReactorThread_create 创建了 serv->reactor_threads 对象后,swServer_start 调用 swReactorThread_start 创建了 reactor 多线程。线程在建立之时,就会调用 swReactorThread_loop 函数开启 reactor 事件循环。

Swoole 源码分析——Server模块之Start

2018-08-12
阅读 25 分钟
2k
在 server 启动之前,swoole 首先要调用 php_swoole_register_callback 将 PHP 的回调函数注册到 server 的对象函数中去

Swoole 源码分析——Server模块之初始化

2018-08-12
阅读 14 分钟
2.7k
前言 本节主要介绍 server 模块进行初始化的代码,关于初始化过程中,各个属性的意义,可以参考官方文档: SERVER 配置选项 关于初始化过程中,用于监听的 socket 绑定问题,可以参考: UNP 学习笔记——基本 TCP 套接字编程 UNP 学习笔记——套接字选项 构造 server 对象 构造 server 对象最重要的是两件事:swServer_init ...

Swoole 源码分析——Reactor 模块之 ReactorEpoll

2018-08-12
阅读 9 分钟
2.4k
在 linux 中,最为高效的 reactor 机制就是 epoll。swReactor 的 object 会存储 epoll 的对象 swReactorEpoll_s。该数据结构中 epfd 是 epoll 的 id,events 用于在 epoll_wait 函数接受就绪的事件。

Swoole 源码分析——Reactor模块之ReactorBase

2018-08-12
阅读 13 分钟
2.7k
作为一个网络框架,最为核心的就是消息的接受与发送。高效的 reactor 模式一直是众多网络框架的首要选择,本节主要讲解 swoole 中的 reactor 模块。

Swoole 源码分析——基础模块之HashMap

2018-08-12
阅读 28 分钟
2.5k
HashMap 比较复杂的地方在于其节点 swHashMap_node 的 UT_hash_handle 数据成员,该数据成员是 C 语言 hash 库 uthash,HashMap 大部分功能依赖于这个 uthash。

Swoole 源码分析——锁与信号量模块

2018-08-12
阅读 11 分钟
2.5k
对于多进程多线程的应用程序来说,保证数据正确的同步与更新离不开锁和信号,swoole 中的锁与信号基本采用 pthread 系列函数实现。UNIX 中的锁类型有很多种:互斥锁、自旋锁、文件锁、读写锁、原子锁,本节就会讲解 swoole 中各种锁的定义与使用。

Swoole 源码分析——内存模块之swBuffer

2018-08-12
阅读 4 分钟
1.7k
swoole 中数据的接受与发送(例如 reactor 线程接受客户端消息、发送给客户端的消息、接受到的来自 worker 的消息、要发送给 worker 的消息等等)都要涉及到缓冲区,swoole 中的缓冲区实现是 swBuffer,实际上是一个单链表。

Swoole 源码分析——内存模块之内存池

2018-08-12
阅读 13 分钟
1.5k
Swoole 中为了更好的进行内存管理,减少频繁分配释放内存空间造成的损耗和内存碎片,程序设计并实现了三种不同功能的内存池:FixedPool,RingBuffer 和 MemoryGlobal。

Swoole 源码分析——内存模块之共享内存表swoole_table

2018-08-11
阅读 25 分钟
2.4k
swoole_table 实际上就是一个开链法实现的哈希表,memory 是一个由哈希键与具体数据组成的数组,如果哈希冲突(不同的键值对应同一个哈希),那么就会从 pool 中分配出一个元素作为数组元素的链表尾

Swoole 源码分析——内存模块之共享内存

2018-08-11
阅读 4 分钟
3k
我们知道,由于 PHP 没有多线程模型,所以 swoole 更多的使用多进程模型,因此代码相对来说更加简洁,减少了各种线程锁的阻塞与同步,但是也带来了新的问题:数据同步。相比多线程之前可以直接共享进程的内存,进程之间数据的相互同步依赖于共享内存。本文将会讲解 swoole 中共享内存的源码。