分析easyswoole源码

1以启动为例
//检查是否已经安装
installCheck();//检查锁文件是否存在,不存在结束
//启动服务
serverStart
showLogo();//显示logo
$conf = Conf::getInstance();//获取config单例
$inst = Core::getInstance()->initialize();//获取Core(核心类)的单例并且initialize
//这一步干了这些事情
//__construct() Core的构造函数进行了这些操作
defined('SWOOLE_VERSION') or define('SWOOLE_VERSION',intval(phpversion('swoole')));//定义了swoole的版本
defined('EASYSWOOLE_ROOT') or define('EASYSWOOLE_ROOT',realpath(getcwd()));//定义了es的root目录
//加载事件函数(里面有frameInitialize,mainServerCreate,onRequest,afterAction的回调函数)
if(file_exists(EASYSWOOLE_ROOT.'/EasySwooleEvent.php')){
require_once EASYSWOOLE_ROOT.'/EasySwooleEvent.php';
}
$this->sysDirectoryInit();
这一步干了这些事情
$tempDir = Config::getInstance()->getConf('TEMP_DIR');//获取config配置的TEMP_DIR设置(在系统根目录Config.php下'TEMP_DIR'=>null,若不配置,则默认框架初始化)
if(empty($tempDir)){
Config::getInstance()->setConf('TEMP_DIR',EASYSWOOLE_ROOT.'/Temp');//会初始化为根目录下的Temp目录
$tempDir = EASYSWOOLE_ROOT.'/Temp';
} $logDir = Config::getInstance()->getConf('LOG_DIR');//获取config配置的LOG_DIR设置(在系统根目录Config.php下'LOG_DIR'=>null,若不配置,则默认框架初始化)
if(empty($logDir)){
Config::getInstance()->setConf('LOG_DIR',EASYSWOOLE_ROOT.'/Log');//会初始化为根目录下的Log目录
$logDir = EASYSWOOLE_ROOT.'/Temp';
} Config::getInstance()->setConf('MAIN_SERVER.SETTING.pid_file',$tempDir.'/pid.pid');//在config目录下设置pid.pid的保存路径,设置在Temp目录下
Config::getInstance()->setConf('MAIN_SERVER.SETTING.log_file',$logDir.'/swoole.log');//在config目录下设置swoole.log的保存路径,设置在Log目录下 //initialize做了这些事情
//Di是一个容器,里面可以保存对象,回调函数,和类名以及其他
Di::getInstance()->set(SysConst::VERSION,'2.1.2');//保存当前es的版本号
Di::getInstance()->set(SysConst::HTTP_CONTROLLER_MAX_DEPTH,3);//这一句不晓得3的作用
EasySwooleEvent::frameInitialize();//在上面提到的加载事件函数方法中会执行框架初始化的回调函数date_default_timezone_set('Asia/Shanghai');这里框架是设置了当前的时区
$this->errorHandle();
//这里注册了框架的错误处理机制
$conf = Config::getInstance()->getConf("DEBUG");//判断是否开启了debug模式,如果没开启直接不注册异常处理机制,系统会由php抛出异常
if(!$conf){
return;
}
ini_set("display_errors", "On");
error_reporting(E_ALL | E_STRICT);
$userHandler = Di::getInstance()->get(SysConst::ERROR_HANDLER);//会去系统配置文件中是否有用户自定义的错误处理函数,在系统vendor\easyswoole\easyswoole\src\Core\Component\SysConst.php中设置为const ERROR_HANDLER = 'ERROR_HANDLER';
if(!is_callable($userHandler)){//如果is_callable=false(不可调用的函数,会自己注册一个userHandler)
$userHandler = function($errorCode, $description, $file = null, $line = null){
Trigger::error($description,$file,$line,$errorCode);//其实userHandler和shutdown注册的函数都会调用Trigger::error,如果没有配置具体的处理方法的话,会默认 Logger::getInstance()->log($debug,'debug');Logger::getInstance()->console($debug,false);就是在LOG_DIR创建了一个日志记录错误同时控制台输出错误
};
}
set_error_handler($userHandler);//设置用户的函数 (error_handler) 来处理脚本中出现的错误。这个函数一般和trigger_error一起使用,抛出用户级别错误然后让$userHandler来捕获 $func = Di::getInstance()->get(SysConst::SHUTDOWN_FUNCTION);//会去系统配置文件中是否有注册一个会在php中止时执行的函数,在系统vendor\easyswoole\easyswoole\src\Core\Component\SysConst.php中设置为const SHUTDOWN_FUNCTION = 'SHUTDOWN_FUNCTION';
if(!is_callable($func)){//如果is_callable=false(不可调用的函数,会自己注册一个func)
$func = function ()use($conf){
$error = error_get_last();
if(!empty($error)){
Trigger::error($error['message'],$error['file'],$error['line']);
}
};
}
register_shutdown_function($func);
$version = \EasySwoole\Core\Component\Di::getInstance()->get(\EasySwoole\Core\Component\SysConst::VERSION);
echo "\n\e[31mEasySwoole\e[0m framework \e[34mVersion {$version}\e[0m\n\n";//在这个文档的38行保存的es版本号
// listen host set
if (isset($options['ip'])) {
$conf->setConf("MAIN_SERVER.HOST", $options['ip']);//在config目录下设置MAIN_SERVER.HOST;'HOST'=>'0.0.0.0',
}
showTag('listen address', $conf->getConf('MAIN_SERVER.HOST'));//showTag是一种包装的echo
if (!empty($options['pid'])) {//这个框架默认是为空的,因为swoole的server启动会自己创建
$pidFile = $options['pid'];
$conf->setConf("MAIN_SERVER.SETTING.pid_file", $pidFile);
} // worker num set
if (isset($options['workerNum'])) {//设置task数
$conf->setConf("MAIN_SERVER.SETTING.worker_num", $options['workerNum']);//在config目录下设置MAIN_SERVER.SETTING.worker_num;'worker_num'=>8
}
showTag('worker num', $conf->getConf('MAIN_SERVER.SETTING.worker_num')); // run at user set
//这个就是设置当前脚本的执行用户,我是自己的虚拟机,就是用root用户启动的
$user = get_current_user();
if (isset($options['user'])) {
$conf->setConf("MAIN_SERVER.SETTING.user", $options['user']);
$user = $conf->getConf('MAIN_SERVER.SETTING.user');
}
showTag('run at user', $user);
// daemonize set
$label = 'false';
//设置是否daemonize,守护进程模式
if (isset($options['d'])) {
$conf->setConf("MAIN_SERVER.SETTING.daemonize", true);
$label = 'true';
}
showTag('daemonize', $label);
// cpuAffinity set
if (isset($options['cpuAffinity'])) {
$conf->setConf("MAIN_SERVER.SETTING.open_cpu_affinity", true);
}
showTag('debug enable', $conf->getConf('DEBUG') ? 'true' : 'false');//输出配置的debug模式是否开启
showTag('swoole version', phpversion('swoole'));//输出当前swoole的版本
showTag('swoole pid', getmypid());//获取当前启动进程的pid $inst->run();//这里是核心。下篇文档进行分析

一 分析easyswoole源码(启动服务)的更多相关文章

  1. 二 分析easyswoole源码(启动服务)

    前文连接,阅读的时候最好参照EasySwoole2.1.2的源码 $inst->run();//启动服务 这里实际调用的是Core的start方法ServerManager::getInstan ...

  2. 四 分析easyswoole源码(启动服务&Cache组件原理)

    前文提到的在系统设置Cache组件 Cache::getInstance()的时候,会去调用processManager去创建Cache的进程,然后以管道通信的方式进行设置缓存和获取缓存. Cache ...

  3. 三 分析easyswoole源码(启动服务&TableManager,略提及Cache工具的原理)

    前文连接,讲了es是如何启动swoole服务的. 里面有一个工具类TableManager.这个类为了处理进程间数据共享.是对swoole_table的一层封装swoole_table一个基于共享内存 ...

  4. Netty源码解析---服务端启动

    Netty源码解析---服务端启动 一个简单的服务端代码: public class SimpleServer { public static void main(String[] args) { N ...

  5. k8s client-go源码分析 informer源码分析(2)-初始化与启动分析

    k8s client-go源码分析 informer源码分析(2)-初始化与启动分析 前面一篇文章对k8s informer做了概要分析,本篇文章将对informer的初始化与启动进行分析. info ...

  6. 【一起学源码-微服务】Nexflix Eureka 源码十:服务下线及实例摘除,一个client下线到底多久才会被其他实例感知?

    前言 前情回顾 上一讲我们讲了 client端向server端发送心跳检查,也是默认每30钟发送一次,server端接收后会更新注册表的一个时间戳属性,然后一次心跳(续约)也就完成了. 本讲目录 这一 ...

  7. 【一起学源码-微服务】Nexflix Eureka 源码十三:Eureka源码解读完结撒花篇~!

    前言 想说的话 [一起学源码-微服务-Netflix Eureka]专栏到这里就已经全部结束了. 实话实说,从最开始Eureka Server和Eureka Client初始化的流程还是一脸闷逼,到现 ...

  8. 【一起学源码-微服务】Eureka+Ribbon+Feign阶段性总结

    前言 想说的话 这里已经梳理完Eureka.Ribbon.Feign三大组件的基本原理了,今天做一个总结,里面会有一个比较详细的调用关系流程图. 说明 原创不易,如若转载 请标明来源! 博客地址:一枝 ...

  9. [源码分析] 从源码入手看 Flink Watermark 之传播过程

    [源码分析] 从源码入手看 Flink Watermark 之传播过程 0x00 摘要 本文将通过源码分析,带领大家熟悉Flink Watermark 之传播过程,顺便也可以对Flink整体逻辑有一个 ...

随机推荐

  1. Ansible 快速部署 Zabbix 4

    阅读本文章需要具有Ansible.Zabbix基础.本次教程基于如下环境: CentOS 7.x Zabbix 4.0 Ansible 2.5 服务器初始化 关闭防火墙.selinux,添加epel常 ...

  2. Day 09 函数基础

    函数初级 简介 # 函数是一系列代码的集合,用来完成某项特定的功能 优点 '''1. 避免代码的冗余2. 让程序代码结构更加清晰3. 让代码具有复用性,便于维护''' 函数四部分 '''1. 函数名: ...

  3. java volatile

    volatile可以保证变量的可见性 当一个变量定义为volatile后,此变量对所有的线程具有可见性.这里的可见性是指当一个线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的. 每次使用v ...

  4. django 路由分发

    对于一个大的工程,可能会有很多应用,比如cmbd,moniter,openstack等等,我们就要用到路由分发 1,首先在跟工程同名的文件夹下的urls中写分发表: from django.conf. ...

  5. ubuntu命令行打开网页

    在Ubuntu下,当需要打开其他格式文件时,比如pdf.jpg.mp3等格式文件,通常做法是进入到文件所在的目录,双击打开,很影响效率.事实上,可以通过命令xdg-open打开这些格式文件,甚至是网页 ...

  6. 【剑指offer】反转链表

    输入一个链表,反转链表后,输出新链表的表头. *与之前的问题不同,这里需要修改链表的指向(之前的问题,不需要修改结点的指针,只需使用栈保存每个结点的值) *注意非空处理以及最后一个结点指针的修改 /* ...

  7. oracle体系结构理解

    体系结构相关内容每次看遍书,过段时间就忘了..无奈用自己理解的方式记录之. 1.commit与写盘与否没有关系,也就是说修改数据(insert update delete)后并提交数据,这条被修改的数 ...

  8. 可空类型(Nullable)

    C# 单问号 ? 与 双问号 ?? ? : 单问号用于对 int,double,bool 等无法直接赋值为 null 的数据类型进行 null 的赋值,意思是这个数据类型是 NullAble 类型的. ...

  9. JS高级-ES6

    let/const case1 { //js var a = 10 a = 20 // es6 let b = 10 b = 30 const c = 10 c = 40 //报错 } case2 { ...

  10. 八(第一篇)、主体结构元素——article元素、section元素

    article元素 article元素代表文档.页面或应用程序中独立的.完整的.可以独自被外部引用的内容. 他可以是一篇博客或者报刊中的文章,一篇轮胎帖子.一段用户评论或独立的插件,或其他任何独立的插 ...