一、 swoole简介
swoole是一个为PHP用C和C++编写的基于事件的高性能异步&协程并行 网络通信引擎
使 PHP 开发人员可以编写高性能的协程 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。使用 PHP + Swoole 作为网络通信架构,可以使企业 IT 研发团队的效率大大提升,更加专注于开发创新产品。
拆分理解:
. swoole 是一个php的扩展,是由 C/C++ 编写的
. swoole 是基于事件的 高性能异步&协程并行 的网络通信引擎
根据关键词理解事件,异步 - 协程并行,网络通信引擎;
事件:
就是某一个动作发生的时候就可以称之为事件,例子:前台 js 的鼠标点击事件。
异步/携程/并行:
暂时可以理解为只是一种程序执行的模式。
二、swoole与workman的区别
相同点:workerman和swoole都是php socket 服务器框架,都支持长连接、tcp和udp、websocket、异步、分布式部署等
1、swoole是使用C语言实现的socket通信框架,workerman则是使用纯php实现的socket框架,二者进程模型上也存在很多的不同。
swoole的进程模型
swoole的进程模型说明:
- master进程
这个进程比较复杂,也是我认为最核心的进程,这是一个包含多线程的进程,分别是一个主线程和n个reactor线程(数量可以配置)。
其中,主线程用于accept新的连接,然后评估一下每个reactor线程负责维护的连接数,然后分配给数量最少的那个reactor线程,最大程度保证每个reactor线程的负载量是均衡的。
本质上讲,一旦一个socket可读或者可写了,就由reactor线程发送给worker进程或者发送会客户端。除此之外,主线程还负责对所有信号的接管,避免reactor线程收到信号的打扰中断。
说的洋气点儿就是:master进程负责了连接的accept、托管、socket的可读可写(数据的发送和接受),本质上讲,master进程负责了IO。还需要注意一点儿的是reactor线程是彻底的全异步非阻塞工作方式。
- manager进程
manager进程是worker进程和taskworker进程的妈,说的洋气点儿就是manager进程fork出来了worker进程和taskworker进程,生出来了就得管,所以,manager进程得负责对worker进程和taskworker进程的抚养义务,具体包括监控它们的状态、当它们意外挂了后重新拉起一个新的进程(避免了僵尸进程)、平滑重启(就是传说中的reload)。
- worker进程
worker进程是manager进程fork出来的,这个进程说白了就是搬砖干活(官方文档中屡次提到的业务代码),其实就是平时码的那些curd业务逻辑代码,只不过worker进程比较屌的是,这个进程可以用异步方式去工作,也可以用同步方式去工作。
- taskworker进程
taskworker进程(后文中称tasker进程)实际本质上也是worker进程,只不过是一种特殊的worker进程。如果你的worker进程中存在一些耗时耗力的操作,那么可以先抛给tasker进程,自己先去干别的,等tasker干完了,再由worker进程取回,非常屌。但是tasker进程只能工作在同步方式下,并不能使用异步。这就是为什么tasker进程不可以使用定时器,而worker进程可以使用定时器的原因。
简单总结混在一起说下这几种进程之间是怎么搭配起来干活的。见说来说,就是master进程就是接活儿的销售,但是具体干活则由worker进程来做,如果worker进程感觉到某些流程太繁忙复杂就可以让tasker进程来做。而manager进程就是后勤worker进程和takser进程的人力资源保障部,负责他们的生死存亡和吃喝拉撒。
而workerman的进程模型相对就要简单很多了,首先相对于swoole来说,workerman没有swoole中的reator线程,其次workerman没有用于处理普通业务的worker进程以及tasker进程。而workerman的话,socket是由worker进程负责的,swoole中则是由主进程中的reactor线程来负责的。而swoole在接受到数据后,可以通过自己的worker进程来处理业务(有点儿类似于fpm进程)。
workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP多进程以及libevent事件轮询库,PHP开发者只要实现一两个接口,便可以开发出自己的网络应用,例如Rpc服务、聊天室服务器、手机游戏服务器等。
workerman的目标是让PHP开发者更容易的开发出基于socket的高性能的应用服务,而不用去了解PHP socket以及PHP多进程细节。 workerman本身是一个PHP多进程服务器框架,具有PHP进程管理以及socket通信的模块,所以不依赖php-fpm、nginx或者apache等这些容器便可以独立运行
workerman有两种进程模型
1、基本的master worker模型
2、master gateway worker模型
master worker模型工作流程及进程间关系如下:
master worker模型说明:
master进程为主进程,启动过程中读取conf配置,根据每个应用配置中的ip和端口创建监听socket,然后再根据配置中的进程数创建对应数量的子进程即worker进程,worker进程会自动继承master进程创建的监听socket,使得worker进程能够独立的接受并处理客户端的连接。
而后master进程进入监听信号的逻辑中,监听worker进程退出信号(worker进程退出后,系统会自动向master进程发送一个SIGHCLD信号,mater进程会重新创建子进程,将缺失的子进程补上),master进程还会监听workermand脚本发来的停止信号(SIGINT)和平滑重启服务信号(SIGHUP)
worker进程为master进程派生出来的子进程,自动继承了master进程的监听socket,每个worker进程独立的接受并处理客户端的连接。
master worker模型比较适合业务简单的应用或者短连接应用
master gateway worker模型工作流程和进程间关系如下:
master gateway worker 模型说明:
这种模型多了一个gateway进程组,工作流程与master worker模型基本相同,区别是worker进程不再直接与客户端打交道,客户端与worker进程之间多了一个gateway进程,gateway专职处理网络IO,并维护客户端的长连接。
master gateway worker 模型非常适合长连接应用
当我们业务代码以同步阻塞方式来使用swoole和workerman的时候,swoole则很像nginx+fpm的二合一体,而workerman则只相当于nginx,这就是区别啦!
2、swoole可以直接安装使用,workman需要安装其他拓展,swoole使用方便,可以直接引用。
外部依赖上workerman需要依赖很多额外的第三方PHP扩展来实现,局限性比较大,这些扩展并非是PHP官方维护的,维护性方面良莠不齐,有些扩展连PHP7都不支持,数年没人维护。而Swoole基本上无依赖,底层的代码全部可控。
开发维护方面,Swoole的开发团队目前有大概18人左右,开发者基本上都是来自腾讯、百度、阿里、滴滴、微博等国内一线互联网企业,支持维护的团队更稳定
3、swoole采用协程,workman暂不支持
协程的优点:
- 协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态。
- 协程的执行效率非常高。因为子程序切换不是线程切换,而是由程序自身控制。因此,没有线程切换的开销,和多线程相比,线程数量越多,相同数量的协程体现出的优势越明显
- 不需要多线程的锁机制。由于只有一个线程,也不存在同时写变量的冲突,在协程中控制共享资源不需要加锁,只需要判断数据的状态,所以执行效率远高于线程 ,对于多核CPU可以使用多进程+协程来尽可能高效率地利用CPU。
4、当然workerman的优势是它完全使用PHP代码实现,开发者可以直接看它的源码。有特殊需求也可以直接改源码来实现。如果换成swoole就不是那么简单了。
workerman做的事情更多一些,即是框架又是工具和完整的解决方案,对于没有太多后端编程功底的程序员也来说确实会容易很多。
而swoole实际上只是一个底层库,不是拿来可用的完整产品,基于swoole有很多PHP的框架和程序,比如tsf、zan php framework、hprose-swoole、zphp、swoole/framework、blink、dorarpc、SwooleDistributed等等,普通开发者可以直接基于这些项目进行开发。
三、swoole安装
环境说明:
系统:centos-7.6.18
集成工具:宝塔
Php:7.2.0 >
Swoole: 最新版本 4.5.6
1、虚拟机上安装宝塔:
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
2、在宝塔上安装nginx、php
3、获取swoole文件安装包 并下载安装包
# 第一种: 直接在当前目录下载文件 安装包
git clone https://github.com/swoole/swoole-src/releases(如果此命令不能下载可以直接去这个网址上下载下来后并上传到虚拟机上)
# 第二种: 直接在github/ 码云上下载安装包
github 地址:https://github.com/search?q=swoole
码云地址:https://gitee.com/swoole/swoole
4、解压压缩包
在swoole 文件中 运行 phpize找到这个文件的位置运行 生成 configure 文件
cd swoole
phpize
./configure --with-php-config=/www/server/php/72/bin/php-config
make && make install
5、编译安装到系统成功后,需要在 php.ini 中加入一行 extension=swoole.so 来启用 Swoole 扩展
6、测试:php –ri swoole
四、swoole的进程管理模式
swoole进程分为三种角色:reactor线程、worker进程、taskworker进程
-
reactor线程
负责维护客户端TCP连接、处理网络IO、处理协议、收发数据
完全是异步非阻塞的模式
全部为C代码,除Start/Shudown事件回调外,不执行任何PHP代码
将TCP客户端发来的数据缓冲、拼接、拆分成完整的一个请求数据包
Reactor以多线程的方式运行 -
Worker进程
接受由Reactor线程投递的请求数据包,并执行PHP回调函数处理数据
生成响应数据并发给Reactor线程,由Reactor线程发送给TCP客户端
可以是异步非阻塞模式,也可以是同步阻塞模式
Worker以多进程的方式运行 -
TaskWorker进程
接受由Worker进程通过swoole_server->task/taskwait方法投递的任务
处理任务,并将结果数据返回(使用swoole_server->finish)给Worker进程
完全是同步阻塞模式
TaskWorker以多进程的方式运行 -
图解swoole进程关系:
swoole中的reactor线程、worker进程、taskworker进程之间的关系类似于nginx与php-fpm之间的关系。
master进程启动后,创建reactor线程和manager进程。
reactore用于监听请求,并将请求下发给worker进程。(类似于nginx)
worker进程将耗时的处理转发给task进程处理。(类似于php-fpm)
manager进程用来管理worker进程和task进程,当worker、task进程处理了一定的连接(max_request)后自动重启,防止内存泄漏。
底层会为Worker进程、TaskWorker进程分配一个唯一的ID
不同的Worker和TaskWorker进程之间可以通过sendMessage接口进行通信