导语php
PHP是最好的语言,Swoole从新定义了最好的语言,这固然是个梗了,不过php作为一个入门低、开发快、执行效率高的一门语言,而在以快速著称的pc互联网时代,无可争议的成为首选,这是php的优点,而后优点慢慢转化为思惟定势,在不少工程师看来php开发就等同于web开发,然而现在已是移动互联的时代,物联网,智能硬件也如火如涂,好像php不是那么受待见了(ps:一直如此),而swoole的出现,成功突破了这一思惟定势,使phper能够从web开发跳出,进入了更大的服务器网络编程领域,但web开发和服务器网络编程在开发思惟上仍是有很大的不一样,本系列文章将经过swoole的介绍,帮助你们作思惟转换,从而进入一个新天地。mysql
PHP与SWOOLE的关系web
swoole是php的一个扩展,纯c开发,主要是为了补充php在网络编程方面的不足sql
PHP与SWOOLE的运行模式编程
php作为swoole的宿主,因此了解php自己的运行模式是必不可少的,下图是以cli下执行一个php文件时的完整流程
这上层有个SAPI的概念,SAPI是php给外部环境可以执行php内核提供的一个统一接口,咱们常见的三种SAPI有cli, php-fpm, mod_php。缓存
在这里,以fpm为例,把运行周期的关键5步拿出来:安全
MINIT服务器
在这步(包括以前)php引擎会初始化一些公用配置,读取ini文件,加载zend引擎,执行因此模块的MINIT模块,而后就长驻在fpm进程中,而后就等待处理请求swoole
RINIT网络
在每一个请求过来以后,会调用全部模块的RINIT进行一些请求内数据的初始化,好比一些超全局变量,一些模块数据初始化等
执行php
而后在这加载php文件,进行词法,语法分析,生成opcode代码,交由zend vm执行, 暂存执行结果
RSHUTDOWN
在把结果返回给fpm以前,会调用全部模块的RSHUTDOWN模块进行一些数据的回收,zend vm也会关闭打开的数据流,进行内存释放等操做,而后把暂存的执行结果flush输出
MSHUTDOWN
这一阶段在重启fpm时发生,会调用全部模块的MSHUTDOWN,关闭zend引擎等操做
到这,能够获得一些结论:
fpm每一个请求都是在执行2~4步
opcode cache是把第3步的词法分析、语法分析、生成opcode代码这几个操做给缓存起来了,从而达到加速的做用
几个误区:
请求都是独立的,不能进行数据共享? 其实仍是有办法进行在数据共享的,那就是在MINIT这步,由于这一步的数据是长驻在fpm进程中,比较典型的是ini配置文件,我没看过鸟哥新出的yaconf, 不过我猜想yaconf的配置读取也应该是放在这一步进行
每一个请求都能独立释放内存, 因此整体是安全的。(这也是大多数phper没有关闭资源的习惯,如mysql close等),那这也是有问题的,颇有可能在扩展层有内存泄漏的存在,因此fpm提供max_reuqest来重启fpm,达到彻底释放内存的目的,固然整体而言,php在内存控制方面仍是至关不错的。
OK, 咱们分析出了php的基本流程,那swoole是在哪一步执行的呢?首先,swoole运行有个前提条件:必需在cli模式下执行. 而后在第3步,swoole就接管了php,进入了swoole的生命周期了。swooele的生命周期以多进程模式为例,以下:
onStart
在回调此函数以前Swoole Server已进行了以下操做
已建立了manager进程
已建立了worker子进程
已监听全部TCP/UDP端口
已监听了定时器
此函数是在主进程回调的,和worker进程的onWorkStart是并行的没有前后之分,在此回调里强烈要求只作log记录,设置进程名操做,不作业务逻辑,不然业务逻辑代码的错误致使master进程crash,让整个swoole server不对对外提供服务了。
onWorkStart
每一个worker或task进程在启动以后,会回调此函数,因为此回调相似于fpm里的MINIT,因此能够在这里作一个全局的资源加载,框架初始化之类的操做,这样能够对每一个请求作全局共享,而达到提高性能的目的
onReceive
每一个请求(也称数据到达),会回调此函数,而后进行业务逻辑处理,输出结果
onWorkerStop
worker退出时,会回调此函数。
onShutDown
swoole服务中止回调此函数,而后继续fpm的第四、5步,进而退出ph生命周期。