swoole基础概念
swoole实现的tcp服务器,默认使用swoole_process模式即多进程模式,除了worker进程外,会创建master和manager两个进程。
swoole tcp server特点:
1、异步服务器,监听事件
2、当有新的连接会执行onConnect回调,收到数据触发onReceive,客户端断开触发onClose
3、
f
d
客
户
端
连
接
唯
一
标
识
4
、
fd客户端连接唯一标识 4、
fd客户端连接唯一标识4、server->send()向客户端发送数据
5、$server->close()强制关闭客户端连接
swoole tdp server特点:
1、异步服务,事件监听
2、客户端无需连接,onPacket
3、
c
l
i
e
n
t
I
n
f
o
是
客
户
端
相
关
信
息
,
是
一
个
数
组
4
、
clientInfo是客户端相关信息,是一个数组 4、
clientInfo是客户端相关信息,是一个数组4、server->sendto()向客户端发送数据
swoole四层生命周期:
1、程序全局器:$server->start()之前创建的对象资源,持续驻留内存,woker共享,全局期代码在server结束时才释放,reload无效。
2、进程全局器:server启动后创建多个进程,他们内存空间独立,非共享内存。worker进程启动后,引入的代码在进程存活期有效,reload会重新加载。
3、会话期:在onConnect或第一次onRecieve时创建,onClose销毁,客户端连接后创建的对象会常驻内存,直到次客户端离开才销毁。
4、请求器:在onRecieve/onReuqest收到请求时开始,直到发送response返回。请求完成后创建的对象会在请求后销毁。
swoole全局配置选项:
Swoole\Server::set([])
reactor_num—设置为cpu核数的两倍,必须小于或等于worker_num参数
worder_num—业务同步阻塞:1请求50ms,那么单进程qps=100,4进程400qps;业务异步非阻塞,设置为cpu核数的1到4倍
max_request 只能用于同步阻塞程序。base模式该参数无效
事件执行顺序:
所有事件回调均在server start后发生。
服务器关闭终止触发onShutdown。
服务器启动成功,onStart/onManagerStart/onWorkerStart会并发执行。
onReceive/onConnect/onClose在worker进程中触发。
worker/task进程启动和结束分别调用onworkerstart和onworkerstop。
onTask事件仅在task进程中发生。
onFinish事件仅在worker进程中发生。
swoole http server:
继承自swoole/server,支持同步和异步模式。
同步模式等同于php-fpm模式,需要设置大量worker进程完成并发请求处理,编程方式与普通php web程序一致。优点是能应对大量客户端并发请求,类似于nginx。
异步模式:
异步非阻塞,可以应对大量并发请求,但编程要使用异步API。4.3版本已经移除异步模块,建议使用Coroutine。
执行异步任务:
设置的onTask回调函数在task进程池内被异步执行,执行完后return非null的变量或者调用
s
e
r
v
e
r
−
>
f
i
n
i
s
h
(
)
来
返
回
结
果
。
r
e
t
u
r
n
和
server->finish()来返回结果。 return和
server−>finish()来返回结果。return和server->finish()操作都是可选的,onTask也可以不返回结果。
onTask返回结果才会触发onFinish,执行onFinish逻辑的worker进程和下发任务的worker是同一进程。
CSP编程不同于创痛的通过共享内存来通信,CSP讲究以通信的方式来共享内存。swoole使用到了CSP里面的部分概念,参考了Golang的实现,使用go协程作为执行体,用Chan作为实体间通信的通道,Defer在协程退出时执行。
swoole协程特点:
默认开启了enable_coroutine选项,底层会在一些回调函数中自动创建一个协程,此时回调中使用协程API。
协程的切换是隐式发生的,所以协程切换前后不保证全局变量和静态变量的一致性。
swoole协程编程注意:
协程内部禁止使用全局变量。
协程使用use关键字引入外部变量时禁止使用引用传值。
协程之间通讯必须使用channel(IPC,redis等)。
多个协程公用一个连接、使用全局变量,类的静态变量保存上下文会出现错误。
协程执行基本概念:
协程遇到IO等待立即将控制权切换,IO完成后,重新将执行流切换到切出点。
协程并发,依次执行,其余同上。
协程嵌套执行,流程由外向内逐层进入,直到发生IO,然后切到外层协程,父协程不会等待子协程
结束。
并发调用:
1、exec协程并发执行
2、绝大部分协程组件都支持了setDefer特性,可以实现先发送数据,再并发收取响应结果。
3、子协程与通道实现并发请求。
主协程不会等待子协程结束,若需要等待,则需要通道来实现。waitgroup
swoole\table
用于解决多进程、多线程数据共享和同步加锁问题。
您可能感兴趣的文章:
swoole基础概念
php为什么要用swoole?
easyswoole 启动TableManager Cache工具的原理
2020最新swoole视频教程推荐(从入门到高级)
php使用swoole为什么会快
photoshop通道概念使用经验技巧详解
php和c语言哪个好学
php开发难学么
学习J2SE过程中的30个基本概念
linux文件系统路径学习