以下内容需要结合es的源码,不然可能会觉得跳跃。先描述下es启动的大致流程。es启动的时候注册异常处理函数以及加载配置文件。根据位置文件的设置选择启动哪种swoole服务。然后用一个事件注册类,注册swoole服务需要的回调函数handler。

在启动前根据配置文件是否启动consoleTcpserver子服务。其他服务可以在EasySwooleEvent::mainServerCreate中注册。es3和es2的区别,es3支持协程以及更加组件化。分为了http组件rpc组件等

根路径的执行路径其实是require ./vendor/easyswoole/easyswoole/bin/easyswoole.php

  1. <?php require './vendor/easyswoole/easyswoole/bin/easyswoole.php';

我们查看这个文件分析start方法,vendor/easyswoole/easyswoole/bin/easyswoole.php::165

  1. //如果是 php easyswoole start produce的指令,就是生产环境,会加载 produce.env
  2. if(in_array('produce',$commandList)){
  3. \EasySwoole\EasySwoole\Core::getInstance()->setIsDev(false);
  4. }
  5. \EasySwoole\EasySwoole\Core::getInstance()->initialize();
  6. //这个代码需要跳入 \EasySwoole\EasySwoole\Core::45

跳入EasySwoole\EasySwoole\Core::45

  1. //检查全局文件是否存在.
  2. $file = EASYSWOOLE_ROOT . '/EasySwooleEvent.php';
  3. if(file_exists($file)){
  4. require_once $file;
  5. try{
  6. $ref = new \ReflectionClass('EasySwoole\EasySwoole\EasySwooleEvent');
  7. if(!$ref->implementsInterface(Event::class)){
  8. die('global file for EasySwooleEvent is not compatible for EasySwoole\EasySwoole\EasySwooleEvent');
  9. }
  10. unset($ref);
  11. }catch (\Throwable $throwable){
  12. die($throwable->getMessage());
  13. }
  14. }else{
  15. die('global event file missing');
  16. }
  17. //上面的代码是为了判断EasySwooleEvent存在并且确保实现了Event::class接口
  18. //执行框架初始化事件,demo中创建了协程数据库连接池
  19. EasySwooleEvent::initialize();
  20. //根据是否是生产环境加载配置文件
  21. $this->loadEnv();
  22. //创建临时目录,主要是记录swoole.log 和 主服务的pid
  23. $this->sysDirectoryInit();
  24. //注册错误回调
  25. $this->registerErrorHandler();

回到vendor/easyswoole/easyswoole/bin/easyswoole.php::170

  1. $conf = \EasySwoole\EasySwoole\Config::getInstance();//获取配置的内容
  2. //是否含有d或者daemonize(示例 php easyswoole start d)指令,如果有,则服务设置为daemonize模式
  3. if(in_array("d",$commandList) || in_array("daemonize",$commandList)){
  4. $conf->setConf("MAIN_SERVER.SETTING.daemonize", true);
  5. }
  6.  
  7. //创建主服务
  8. \EasySwoole\EasySwoole\Core::getInstance()->createServer();
  9. 跳入\EasySwoole\EasySwoole\Core::
  1. 跳入\EasySwoole\EasySwoole\Core::74
  1. //获取配置的主服务的类型以及相关配置,创建swoole服务,dev.env 里服务是WEB_SOCKET_SERVER就是swoole_websocket_server形式创建的服务
  2.  
  3. $conf = Config::getInstance()->getConf('MAIN_SERVER');
  4. ServerManager::getInstance()->createSwooleServer(
  5. $conf['PORT'],$conf['SERVER_TYPE'],$conf['HOST'],$conf['SETTING'],$conf['RUN_MODEL'],$conf['SOCK_TYPE']
  6. );
  7.  
  8. /*下面是注册基本的时间回调,如果swoole服务是SERVER类型会注册onReceive回调事件然后回调是交由EasySwooleEvent的onReceive处理。demo中这个onReceive是空函数没有实现方法。但是如果想开启server的话这里记得补完处理逻辑
  9. 否则就注册默认的request回调,这个会调用es3的http组件(es3最大的变化就是实现了各个模块的组件化以及添加了协程),不过任何的模式都会注册task和finish,用来处理异步任务
  10. pipe通讯是为了对task进程通信
  11. 注册默认的worker start,对work和task进程更名*/
  12. $this->registerDefaultCallBack(ServerManager::getInstance()->getSwooleServer(),$conf['SERVER_TYPE']);
  13.  
  14. //EasySwooleEvent的mainServerCreate函数中,对主服务设置其他的回调函数。示例demo中的rpc留给后面分析
  15. EasySwooleEvent::mainServerCreate(ServerManager::getInstance()->getMainEventRegister());
  16. /*创建主服务后,创建Tcp子服务,我们在前文已经配置了CONSOLE为enable 可以做推送日志等信息。换句话说提供了一个server来用Tcp控制服务器,可以从任意机器控制某个远程的实例*/
  17. (new TcpService(Config::getInstance()->getConf('CONSOLE')));
  1. 之后的都是一些启动时输出相关信息
    回到vendor/easyswoole/easyswoole/bin/easyswoole.php::209
  1. //给主进程也命名然后启动swoole服务
  2. \EasySwoole\EasySwoole\Core::getInstance()->start();

对比之前分析的2.0流程上其实差别不大。就是再读一遍比起2.0要清晰很多。

分析easyswoole3.0源码,服务启动为例(二)的更多相关文章

  1. 分析easyswoole3.0源码,服务启动为例(一)

    swoole已经升级到4了,主要的特性是更好的支持协程,easyswoole也为了更好支持协程推出了es3.我本地环境是php7.2.9 centos7 在github下载最新的3.0的demo.地址 ...

  2. 分析easyswoole3.0源码,consoleTcpService(六)

    前文讲过可以通过配置开启一个tcp服务,叫做consoleTcpservice.EasySwoole\EasySwoole\Core::83行 (new TcpService(Config::getI ...

  3. 分析easyswoole3.0源码,体验es3(三)

    demo在手,总得去试试看效果吧.我们先把默认的服务改成webserver,并且添加数据库的配置. 建立数据库,github里面有相关内容 CREATE TABLE `user_list` ( `us ...

  4. 分析easyswoole3.0源码,协程连接池(五)

    连接池的含义,很多都知道,比如mysql的数据库连接是有限的,一开始连接mysql创建N个连接,放到一个容器里,每次有请求去容器中取出,取出用完再放回去. es3demo里,有mysql的连接池. E ...

  5. 分析easyswoole3.0源码,Trace组件(四)

    前文,我们访问地址的时候服务端会输出类似trace信息.那么原理是什么呢?其实es3已经把这个独立出来作为单独组件了,名字叫做Trace组件 在demo里的调用原理是 EasySwooleEvent: ...

  6. Android 8.1 源码_启动篇(二) -- 深入研究 zygote(转 Android 9.0 分析)

    前言 在Android中,zygote是整个系统创建新进程的核心进程.zygote进程在内部会先启动Dalvik虚拟机,继而加载一些必要的系统资源和系统类,最后进入一种监听状态.在之后的运作中,当其他 ...

  7. Android4.0源码Launcher启动流程分析【android源码Launcher系列一】

    最近研究ICS4.0的Launcher,发现4.0和2.3有稍微点区别,但是区别不是特别大,所以我就先整理一下Launcher启动的大致流程. Launcher其实是贯彻于手机的整个系统的,时时刻刻都 ...

  8. OpenJDK1.8.0 源码解析————HashMap的实现(二)

    上一篇文章介绍了HashMap的一部分的知识,算是为下面HashMap的进一步学习做准备吧. 然后写的时候一直在思考的一个问题是,这方面的知识网上的资料也是一抓一大把,即使是这样我为什么还要花费时间去 ...

  9. WmS简介(三)之Activity窗口是如何创建的?基于Android7.0源码

    OK,在前面两篇博客中我们分别介绍了WmS中的token,同时也向小伙伴们区分了Window和窗口的区别,并且按照type值的不同将Android系统中的窗口分为了三大类,那么本篇博客我们就来看看应用 ...

随机推荐

  1. Win10和Ubuntu双系统搭建详

    最近学习云计算时,需要搭建xen和Hadoop,虚拟机容易出很多问题所以搭建了双系统,也方便以后的学习. 下面是详细搭建过程: 准备材料: U盘(容量>8G,最好是3.0接口速度快).Ultra ...

  2. 基础总结(03)-- css有趣的特性

    1.currentColor:可用于background/border-color/渐变/box-shadow/svg填充色,颜色继承自color. 待补充…

  3. 7.3.5 Tomcat堆溢出分析(1)

    实战Java虚拟机:JVM故障诊断与性能优化>第7章分析Java堆,本章主要介绍了Java堆的分析方法.首先,介绍了几种常见的Java内存溢出现象及解决思路.其次,探讨了java.lang.St ...

  4. 用matplotlib.pyplot画简单的折线图,直方图,散点图

    #coding=utf-8 """ 用matplotlib.pyplot画简单的折线图,直方图,散点图 """ import matplot ...

  5. shell脚本实现telnet测试服务端口

    备注,使用方法:当前目录下要存在需要测试的地址端口的文件ip.txt,例子:cat ip.txt141.12.65.17 7500 #!/bin/bashcur_dir=$(pwd)ipfile=$c ...

  6. EMQTT本地源码搭建填坑记录

    因业务需求需要本地搭建一个emqtt的消息队列服务器,根据官网提示搭建失败,具体如下 官方步骤: Erlang 安装: http://www.erlang.org/ MSYS2 安装: http:// ...

  7. PHP提交订单,信息的传递

    今天被之前的同事问到订单这一块(他用的是Laraver)..."多个商品在同一个订单里,怎么将相同的商品放进一个分组"... 当时我和他的反应都是,array_push, arra ...

  8. C++文档补充

    string s("100010"); bitset<5>  b(s,2,2); 只有上图这样写,下图这样是错的.记住.http://www.cppblog.com/k ...

  9. 企业架构设计之IFW实践回顾

    前言 笔者几年前曾参与过一套网络银行的系统建设以及后续这套系统在信用.云服务.保险.基金.支付等领域的复用,使用了IFW模型的变体.当时仅仅是根据架构师的设计进行编码.测试和交付以及后续的维护,没有对 ...

  10. Linux网络编程学习(十一) ----- 五种I/O模式(第六章)

    1.五种I/O模式是哪几个? 阻塞I/O,非阻塞I/O,I/O多路复用,信号驱动I/O(SIGIO),异步I/O 一般来讲程序进行输入操作有两个步骤,一是等待有数据可读,二是将数据从系统内核中拷贝到程 ...