core.php 和 server.php 源码分析

    首先我扪要一些swoole的基础

    1. swoole 的整个进程种类是 manager进程,master进程,work进程,task进程
    2. maskter进程:Swoole的主进程,是一个多线程的程序。其中有一组很重要的线程,称之为Reactor线程。它就是真正处理TCP连接,收发数据的线程。把接受到的数据分配给worker进程
    3. mananger进程:负责管理work进程和task进程,如果有进程死了,就会重新开一个进程
    4. worker进程:正常处理业务逻辑的进程
    5. task进程:负责处理异步任务的进程,任务由work进程投递过来

    开启一个多进程swoole http服务器需要注册的函数:

    1. onstart事件
    2. 在此事件之前Swoole Server已进行了如下操作
    3. 已创建了manager进程
    4. 已创建了worker子进程
    5. 已监听所有TCP\/UDP端口
    6. 已监听了定时器
    7. onshutdown事件
    8. 在此之前Swoole Server已进行了如下操作
    9. 已关闭所有线程
    10. 已关闭所有worker进程
    11. close所有TCP\/UDP监听端口
    12. 已关闭主Rector
    13. onworkerstart事件
    14. task进程和work进程开启时都会调用此函数
    15. onworkerstop事件
    16. task进程和work进程结束都会调用此函数
    17. onrequest事件
    18. 用户发送请求会触发此函数,此函数会随机在一个work进程种
    19. ontask事件
    20. 当系统投递task任务时会触发此函数(注意投递一次会就占用一个task进程,直到任务结束,task进程才会空闲,要是短时间投递任务数超过task进程数,任务就会进入队列排队)
    21. onfinish事件
    22. task任务结束时会触发此任务,注意想要开启task功能必须注册这两个事件
    23. onworkerror事件
    24. work进程出错时会触发此函数

    下面我们来分析server.php
    server.php

    1. 函数:
    2. getInstance\(\):获得sever服务对象的实例,此类采用单例模式,当框架运行的时候,全局每个进程有且只有一个server对象,每个对象是相互独立的
    3. \_\_construct\(\):构造函数,这个函数只负责对server基本的配置
    4. is\_start\(\):判断服务是否已经启动
    5. stratServer():启动服务,在这个函数会调用很多其他函数,对server对象各个事件进行注册,
    6. getServer():获得swooleserver对象
    7. 私有workStartEvent\(\):在startserver()被调用,实现了的功能是注册swoole服务器的onworksart事件,注册事件调用的是event里的onworkerstart函数,在这个事件里面一般是启动定时器等等,这个事件会在每个worker进程和task进程开启的时候被触发
    8. 私有workStopEvent\(\):在startServer()被调用,实现的功能是注册了swoole服务器的onwrokstop事件,注册事件里面调用了eventonworkstop函数
    9. 私有onTaskEvent\(\):在startServer()被调用,实现的功能是注册了swoole服务器的ontask事件,注册事件里面调用了eventontask函数,
    10. 私有onFinish\(\):在startServer()被调用,实现的功能是注册了swoole服务器的ontask事件,注册事件里面调用了eventontask函数,
    11. 私有beforeWorkStart\(\):在startServer()被调用,此函数的功能很大,在swoole启动前对server做了很多的定制,如可以开一个独立的进程,ioc注入,websocket事件回调
    12. 私有serverStartEvent\(\):在startServer()被调用,实现的功能是注册了swoole服务器的onstart事件
    13. 私有serverShutdownEvent\(\):在startServer()被调用,实现的功能是注册了swoole服务器的onshutdown事件
    14. 私有workErrorEvent\(\):在startServer()被调用,实现的功能是注册了swoole服务器的onworkerror事件
    15. 私有pipeMessage\(\):在startServer()被调用,实现的功能是注册了swoole服务器的onpipeMessage事件
    16. 私有listenRequest\(\):
    17. 这是整个框架最核心的部分,这个函数注册了server的监听事件,我们来一句一句分析:
    18. 1 首先把swoole自带的request对象和response对象传入事先封装好的request类和response 实例化出一个 request2对象和 response2对象
    19. 2 调用event用户事先定义好的onrequest事件,相当于对所有请求进行了一次拦截,这这个事件中可以防止恶意工具
    20. 3 调用Dispatcher 事件 ,这个事件里面 先对request对象进行了路由,然后查找到对应的控制器,执行对应控制器的内容,控制器里面会使用wirte等方法将数据写入事先封装好的response对象
    21. 4 调用eventresponse 事件,\(用户可以在此事件进行自己的处理,如过滤返回的数据\)
    22. 5 框架开始拼凑要返回客户端的信息 ,状态码 header头, cookies ,还有response对象里面的body信息(控制器里面write出来的数据)
    23. 6 框架返回数据 response->end

    下面我们来分析core.php 框架的启动类 采用单例模式,当框架运行成功后,每个进程只会只有一个对象
    core.php

    1. 函数:
    2. run():这里会调用server类启动框架
    3. frameWorkInitIalize\(\):这里会进行框架的基本的初始化,判断php版本,注册自动加载,定义全局变量,建立文件夹,注册错误,调用eventframeInitializeframeInitialized事件
    4. defineSysConst\(\):定义系统路径
    5. sysDirectoryInit\(\):创建框架运行时需要的目录,如日志目录等
    6. registerAutoloader\(\):注册自动加载函数,并且设置一些命名空间的路径
    7. reqisterErrorHandler\(\):注册错误函数
    8. preHandle\(\):
    9. 此函数能调用一个匿名函数,匿名函数存在在core类中的perCall里面,这个变量会在类初始化时传入,可以在server文件初始化core时传入一个匿名函数,对框架进行自己的定制,极大的方便了开发者

    总结:easyswoole 为我们封装了swoole,默认运行es框架,就已经运行了一个多进程swoole服务器,我们在swoole每个重要的回调函数里面,都会调用even.php里面事件,所以只需要在even事件里面写我们的事件就好了极大的方便了开发者