初识swoole之swoole内部结构

一、swoole是啥?

1、官方介绍

swoole是面向生产环境的PHP 异步网络通信引擎.
使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域

2、个人理解

swoole是一个PHP的异步网络库,同时也是一个PHP扩展.它为PHP开发网络程序提供了便利的、高效的接口.它与传统的PHP的扩展有很大的区别,它改变了传统PHP的运行方式,通过启动swoole,它会接管原有PHP(如PHP-FPM)的控制权.

3、Swoole能做啥

swoole功能架构图

二、swoole的运行流程与内部结构初探

1、运行流程

这里以web服务器为例,与传统的PHP-FPM并无差异

swoole运行流程

2、内部结构

swoole内部结构

如图,swoole内部共有以下几种角色

  • 主进程:是一个swoole的容器,是其他所有swoole进程的父进程
    • reactor线程:负责接收用户请求,并将请求分发给worker进程(有点类似nginx的功能)
  • manager进程:负责管理worker进程和task进程

    • worker进程:负责处理具体的请求
    • task进程:负责耗时的任务

有人可能会怀疑此上观点的准确性,下面来做一个实例来证明

3、swoole进程管理初探
(1)开启一个swoole的http server
  1. <?php
  2. $server = new \Swoole\Http\Server('0.0.0.0', 9500);
  3. //设置工作进程数量为1
  4. $server->set([
  5. 'worker_num'=>1
  6. ]
  7. );
  8. $server->on('request', function($request, $response){
  9. $response->send("hello world");
  10. });
  11. $server->start();

通过php http.php来开启服务

(2) 通过ps命令来查看当前的php进程
  1. ps aux|grep php

通过上面我们可以看到共开启了3个进程,1个主进程,1个管理进程,1个工作进程

(3)通过pstree来分析php进程的关系
  1. pstree -ap

注:pstree可以查看各进程之间的父子关系,以树状图显示

  • 第一行,进程号为3119的是主进程
  • 第二行,进程号为3120的manager进程
  • 第三行,进程号为3122的为工作进程
  • 第四行,号为3121的reactor线程(注意,这里的3121为线程编号)

思考:为什么使用ps查出的是3个进程,而通过pstree查看有4个呢,其实3121这个编号的进程就是主进程.

(4)通过ps -t查看主进程
  1. ps -T -p 3119

注:

  • ps -T -p 可以查看指定进程号的线程情况
  • pid为进程编号
  • spid为线程编号(当进程号与线程号相同时,表示该线程是主线程)

根据以上的测试,得出swoole的内部结构

三、swoole常用工具及资源

1、swoole开发工具

phpstorm + swoole ide helper

尽管官方已经有ide helper,这里推荐本人整理的一个ide helper里面添加了详细的注释和说明

phpstorm的swoole开发助手

2、swoole官方wiki

swoole官方wiki