Swoole下单例模式思考
应用实例位于 Swoole 的 Worker 进程中,并且常驻内存,这种模式提升了应用性能的同时,也引入了新的复杂性,现在问题来了,单例模式绑定的服务在整个应用生命周期内解析时返回的都是同一个对象实例,现在这个生命周期延生到整个 Worker 进程的生命周期,只要 Worker 进程还在,那么多个请求使用的可能都是同一个单例服务,这对不同请求可以复用单例的场景来说是好事,比如数据库连接,但是对另一些场景,不同请求不能复用同一个实例,比如用户认证,则是灾难了,所以在这种场景下,需要在一次请求完成后手动注销这些单例服务(或者在下次实例化先判断单例是否存在,如果存在将其销毁)。
同理,通过 static 定义的静态变量也要在必要的时候进行清理,通过 global 定义的全局变量则要慎用,因为它会在同一个 Worker 进程处理的多个请求中复用。
禁用函数
exit/die 相关
由于 Swoole 中禁用 exit/die 函数,所以在 Laravel 中也不能使用它们,以及与之相关的 dd 函数。
请求相关
不要使用 $_GET/$_POST/$_FILES/$_COOKIE/$_REQUEST/$_SESSION/$GLOBALS/$_ENV 之类的超全局变量,统一通过 框架自带的请求类 对象获取请求数据。
另外,Swoole 限制 GET 请求头长度不能超过 2KB,POST 请求数据长度也会通过 package_max_length 配置进行限制,默认是 2M。
响应相关
统一通过框架自带的响应类返回响应,不要使用 header()/setcookie()/http_response_code() 之类的函数,以免引起异常问题。
flush 相关
swoole_http_response 不支持 flush 函数,所以不要使用与之相关的 flush/ob_flush/ob_end_flush/ob_implicit_flush 等函数。