一、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的运行流程与内部结构初探
1、运行流程
这里以web服务器为例,与传统的PHP-FPM并无差异
2、内部结构
如图,swoole内部共有以下几种角色
- 主进程:是一个swoole的容器,是其他所有swoole进程的父进程
- reactor线程:负责接收用户请求,并将请求分发给worker进程(有点类似nginx的功能)
manager进程:负责管理worker进程和task进程
- worker进程:负责处理具体的请求
- task进程:负责耗时的任务
有人可能会怀疑此上观点的准确性,下面来做一个实例来证明
3、swoole进程管理初探
(1)开启一个swoole的http server
<?php
$server = new \Swoole\Http\Server('0.0.0.0', 9500);
//设置工作进程数量为1
$server->set([
'worker_num'=>1
]
);
$server->on('request', function($request, $response){
$response->send("hello world");
});
$server->start();
通过php http.php来开启服务
(2) 通过ps命令来查看当前的php进程
ps aux|grep php
通过上面我们可以看到共开启了3个进程,1个主进程,1个管理进程,1个工作进程
(3)通过pstree来分析php进程的关系
pstree -ap
注:pstree可以查看各进程之间的父子关系,以树状图显示
- 第一行,进程号为3119的是主进程
- 第二行,进程号为3120的manager进程
- 第三行,进程号为3122的为工作进程
- 第四行,号为3121的reactor线程(注意,这里的3121为线程编号)
思考:为什么使用ps查出的是3个进程,而通过pstree查看有4个呢,其实3121这个编号的进程就是主进程.
(4)通过ps -t查看主进程
ps -T -p 3119
注:
- ps -T -p 可以查看指定进程号的线程情况
- pid为进程编号
- spid为线程编号(当进程号与线程号相同时,表示该线程是主线程)
根据以上的测试,得出swoole的内部结构
三、swoole常用工具及资源
1、swoole开发工具
phpstorm + swoole ide helper
尽管官方已经有ide helper,这里推荐本人整理的一个ide helper里面添加了详细的注释和说明