Swoole学习总结1

一,Swoole服务三种模式(默认是多进程模式)

# Base模式(SWOOLE_BASE
传统的异步非阻塞Server,reactor和worker是同一个角色。TCP连接是在worker进程中维持的。
如果客户端连接之间不需要交互,可以使用BASE模式。如Memcache、Http服务器等

# 线程模式
多线程Worker模式,Reactor线程来处理网络事件轮询,读取数据。得到的请求交给Worker线程去处理。

缺点:一个线程发生内存错误,整个进程会全部结束。
由于PHP的ZendVM在多线程模式存在内存错误,多线程模式在v1.6.0版本后已关闭。

# 进程模式
与多线程Worker模式不同的是,线程换成了进程。Reactor线程来处理网络事件轮询,读取数据。得到的请求交给Worker进程去处理。适合业务逻辑非常复杂的场景。如WebSocket服务器等。


 



二,进程的关系介绍:

一个最基础的Swoole Server,至少需要有3个进程,分别是Master进程Manager进程Worker进程



Master进程是一个多线程进程,其中有一组非常重要的线程,叫做Reactor线程(组),每当一个客户端连接上服务器的时候,都会由Master进程从已有的Reactor线程中,根据一定规则挑选一个,
专门负责向这个客户端提供维持链接、处理网络IO与收发数据等服务。分包拆包等功能也是在这里完成。


Manager进程,某种意义上可以看做一个代理层,它本身并不直接处理业务,其主要工作是将Master进程中收到的数据转交给Worker进程,或者将Worker进程中希望发给客户端的数据转交给Master进程进行发送。

Manager进程还负责监控Worker进程,如果Worker进程因为某些意外挂了,Manager进程会重新拉起新的Worker进程,有点像Supervisor的工作。而这个特性,也是最终实现热重载的核心机制。

Worker进程其实就是处理各种业务工作的进程,Manager将数据包转交给Worker进程,然后Worker进程进行具体的处理,并根据实际情况将结果反馈给客户端。


三,编程须知
编程须知

1.不要在代码中执行sleep以及其他睡眠函数,这样会导致整个进程阻塞
2.exit/die是危险的,会导致worker进程退出
3.可通过register_shutdown_function来捕获致命错误,在进程异常退出时做一些请求工作,具体参看/wiki/page/305.html
4.PHP代码中如果有异常抛出,必须在回调函数中进行try/catch捕获异常,否则会导致工作进程退出
5.swoole不支持set_exception_handler,必须使用try/catch方式处理异常
6.Worker进程不得共用同一个Redis或MySQL等网络服务客户端,Redis/MySQL创建连接的相关代码可以放到onWorkerStart回调函数中。原因是如果共用1个连接,那么返回的结果无法保证被哪个进程处理。持有连接的进程理论上都可以对这个连接进行读写,这样数据就发生错乱了。具体参考/wiki/page/325.html
7. 不能使用类的属性保存客户端连接信息,因为一个worker进程可以处理多个客户端连接,导致类属性数据错乱。常量则是可以的。
 


原文地址:https://www.cnblogs.com/zhengweizhao/p/8970559.html