easyswoole的运行流程:服务启动前的准备,初始化配置参数,配置事件回调,启动服务,开启监听,接受请求,当请求进来,回调对应的监听方法,处理请求,相应请求。
启动swoole服务后运行流程(底层分析):
master进程启动,创建reactor线程用于处理tcp连接(reactor多线程做的事:连接监听socket,接受转发数据,UDP请求当worker进程处理完后不经过reactor线程,直接转发给客户端,异步非阻塞)
manager进程启动,负责管理worker进程,task进程
worker进程负责处理主要的任务(当达到max_request或者被误杀或者出现php致命错误后,自动重启worker进程,可以同步阻塞,也可以异步非阻塞)
task进程负责辅助worker进程(是同步阻塞的)
swoole对象生命周期:
程序全局(所有worker进程共享)
worker进程全局(多个请求共享)
会话(tcp连接,onConnect onClose方法创建的,一次回话如果是keep-live,会接受多个请求,这里有个坑,服务器模式如果不是固定模式时,或者说是http请求的时候,不会回调onconnect和onclose方法,所以这个回话周期的变量是不起作用的)
请求( onReceive方法回调中创建的对象,和普通php请求一样)
协程
目的:为了解决异步io的同步实现。
如何实现:协程为什么快,除了异步io以外,其他的一切都是内存操作,所以快。唯一的消耗是内存的消耗。
具体的细节:当遇到io操作时,底层会调用c函数将当前协程挂起,去执行其他的操作,当io结束后,底层调用c函数重新恢复,其中会保存zendvm的堆栈信息以及cpu寄存器的状态。