swoole为php带来了什么
Swoole的优势Swoole开源项目就是为了弥补PHP在这些方面的缺陷诞生的。与WordPress这些产品不同,swoole实际上是一个网络通信和异步io的引擎,一个基础库。swoole框架相比apache/fpm,主要节省PHP框架和全局对象每次请求创建销毁带来的性能损耗。swoole框架给程序员提供了最大的空间,与http请求无关的全局对象只需要构造一次。程序中还可以对某些对象和数据进行缓存控制Swoole的未来PHP可以基于swoole去实现过去PHP无法实现的功能。Swoole为PHP打开了通往另一个世界的大门。
swoole
1.常驻内存
在传统的web开发模式中,我们知道,每一次php请求,都要经过php文件从磁盘上读取、初始化、词法解析、语法解析、编译等过程,而且还要与nginx或者apache通信,如果再涉及数据库的交互,还要再算上数据库的握手、验权、关闭等操作,可见一次请求的背后其实是有相当繁琐的过程,无疑,这个过程也就带来了相当多的开销!当然,所有的这些资源和内存,在一次请求结束之前,都会得到释放。
但是,swoole是常驻内存运行的。这有几点不同,我们分别了解下。
在运行server之后所加载的任何资源,都会一直持续在内存中存在。也就是说假设我们开启了一个server,有100个client要connect,加载一些配置文件、初始化变量等操作,只有在第一个client连接的时候才有这些操作,后面的client连接的时候就省去了重复加载的过程,直接从内存中读取就好了。
这样好不好呢?很明显非常好,如此一来还可以提升不小的性能。
但是,对开发人员的要求也更高了。因为这些资源常驻内存,并不会像web模式下,在请求结束之后会释放内存和资源。也就是说我们在操作中一旦没有处理好,就会发生内存泄漏,久而久之就可能会发生内存溢出。
之前一直对swoole印象不错,没想到都是坑。其实这都不算坑,如果你觉得是坑,权且当做是一种提升自身能力的约束好了。
回到我们的开篇提到的问题上,再啰嗦的解释一遍:server一开始就把我们的代码加载到内存中了,无论后期我们怎么修改本地磁盘上的代码,客户端再次发起请求的时候,永远都是内存中的代码在生效,所以我们只能终止server,释放内存然后再重启server,重新把新的代码加载到内存中,如此,明白否?
那有同学要说了,感觉好麻烦,是不是说在swoole中申请的内存啥的都要自己手动unset释放呢?
对于局部变量,就没必要操这个心了,swoole会在事件回调函数返回之后释放。但是对于全局变量你就要悠着点了,因为他们在使用完之后并不会被释放。不会被释放?那在php中,这几种全局变量:global声明的变量,static声明的对象属性或者函数内的静态变量和超全局变量谁还敢用?一个不小心服务器直接就玩完的节奏!
我们想一下为什么要用全局变量?
是不是就是想全局共享?但是,在多进程开发模式下,进程内的全局变量所用的内存那也是保存在子进程内存堆的,也并非共享内存,所以在swoole开发中我们还是尽量避免使用全局变量!
那我要是非用不可呢?就是乐意,就是想用。
我们看看如何避免内存泄漏。
比如有一个static大数组,用于保存客户端的连接标识。我们就可以在onClose回调内清理变量。
此外,swoole还提供了max_request机制,我们可以配置max_request和task_max_request这两个参数来避免内存溢出。
max_request的含义是worker进程的最大任务数,当worker进程处理的任务数超过这个参数时,worker进程会自动退出,如此便达到释放内存和资源的目的。
不必担心worker进程退出后,没“人”处理业务逻辑了,因为我们还有Manager进程,Worker进程退出后Manager进程会重新拉起一个新的Worker进程。
task_max_request针对task进程,含义同max_request。
2.异步
主要归功于swoole reactor异步I/O原理
3.携程
协程实现中,主协程即为Reactor协程,负责整个EventLoop的运行。主协程实现事件监听,在IO事件完成后唤醒其他工作协程。
协程挂起
在工作协程中执行一些IO操作时,底层会将IO事件注册到EventLoop,并让出执行权。
嵌套创建的非初代协程,会逐个让出到父协程,直到回到主协程
在主协程上创建的初代协程,会立即回到主协程
主协程的Reactor会继续处理IO事件、Wait监听新事件(epoll_wait)
初代协程是在EventLoop内直接创建的协程,例如onReceive回调方法中的内置协程就是初代协程
协程恢复
当主协程的Reactor接收到新的IO事件,底层会挂起主协程,并恢复IO事件对应的工作协程。该工作协程挂起或退出时,会再次回到主协程。
总结一下 swoole 的技术特点:
常驻内存,避免重复加载带来的性能损耗,提升海量性能;
基于epoll,轻松支持高并发;
协程异步I/O,提高对I/O密集型场景并发处理能力;
支持多种通信协议,方便地开发 Http、WebSocket、TCP、UDP 等应用。