php是单线程。php是靠多进程来处理任务,任何后端语言都可以采用多进程处理方式。如我们常用的php-fpm进程管理器。线程与协程,大小的关系是进程>线程>协程,而我们所说的swoole让php实现了多线程,其实在这里来说,就是好比让php创建了多个进程,每个进程执行一条线程,从而实现了php"多线程"(java是在一个进程内创建多个线程).
swoole中我启动了一个serve像一个工厂,有两个主要进程,master和manager进程。master进程像创始人老板负责单子业务洽谈,有钱有资源,他拉来一批职业经理人manager进程帮自己管理厂子,然后manager就fork出来很多工人worker进程来干活,后来发现供应物料后勤什么的比较费时间就交给了taskworker进程来做。这样的话一个serve工厂就建立起来了。
woole执行流程
当客户端请求进入Master主进程后会被Master主线程接收到
将读写操作的监听注册到对应的Reactor线程中,并通知Worker工作进程处理onConnect,也就是接收到连接的回调。
客户端的数据会通知对应的Reactor线程并发送给Worker工作进程进行处理。
如果Worker工作进程投递任务,将数据通过管道发送给Task任务进程,Task任务进程处理完后会发送给Worker工作进程。
Worker工作进程会通知Reactor线程发送数据给客户端。
当Worker工作进程出现异常时关闭,Manager管理进程会重新创建一个Worker工作进程,保证Worker工作进程的数量是固定的。
Swoole Coroutine和 Go Goroutine的区别
swoole的协程需要再协程上下文中使用
swoole的协程是通过hook底层php函数实现的,go是原生支持的
swoole是单线程协程,同一时间只会调度一个协程,而go是多线程实现的
Swoole-HTTP-Server模型
Swoole-HTTP-Server和LNMP-with-Swoole相比有巨大的变化,这种模型中充当WebServer角色的构件不仅仅有nginx,应用本身也包含了一个内建WebServer,不过由于Swoole Http Server不是专业的Http Server,对Http的处理不完善 ,因此仍然需要使用Nginx作为静态资源服务器以及反代,Swoole Http Server仅仅处理PHP相关的Http流量。
一方面由于Swoole已经包含了WebServer,不再需要实现cgi或者fast-cgi的通用协议去和WebServer通信,另一方面Swoole有自己的进程管理,因此PHP-fpm可以直接被去除了。对于PHP资源而言,在这种模型中,Swoole Http Server的地位相当于传统模型中的nginx和PHP-fpm之和。