分析easyswoole源码

分析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();//这里是核心。下篇文档进行分析

原文地址:https://www.cnblogs.com/gavinjunftd/p/9430167.html

时间: 2024-11-05 18:48:35

分析easyswoole源码的相关文章

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

前文提到的在系统设置Cache组件 Cache::getInstance()的时候 Cache是以单例模式实现的.构造器会进行如下操作 //根据配置创建指定数目的Cache服务进程,然后启动. $num = intval(Config::getInstance()->getConf("EASY_CACHE.PROCESS_NUM"));//默认配置数目是1,在Config.php里'EASY_CACHE.PROCESS_NUM'=>1 if($num <= 0){ r

OpenStack_Swift源码分析——Object-auditor源码分析(2)

1 Object-aduitor审计具体分析 上一篇文章中,讲解了Object-aduitor的启动,其中审计的具体执行是AuditorWorker实现的,在run_audit中实例化了AuditorWorker类,并调用audit_all_objects方法,下面看此方法的具体代码实现: def audit_all_objects(self, mode='once', device_dirs=None): #run_forever传过来的mode 为forever description =

OpenStack_Swift源码分析——Object-auditor源码分析(1)

1 Object-auditor 的启动 Object-auditor的启动和object-replicator的启动过程是一样的,首先是执行启动脚本 swift-init object-auditor start 启动脚本会运行swift源码bin目录下的swift-ojbect-auditor if __name__ == '__main__': parser = OptionParser("%prog CONFIG [options]") parser.add_option('-

nginx源码分析--从源码看nginx框架总结

nginx源码总结: 1)代码中没有特别绕特别别扭的编码实现,从变量的定义调用函数的实现封装,都非常恰当,比如从函数命名或者变量命名就可以看出来定义的大体意义,函数的基本功能,再好的架构实现在编码习惯差的人实现也会黯然失色,如果透彻理解代码的实现,领悟架构的设计初衷,觉得每块代码就想经过耐心雕琢一样,不仅仅实现了基本的功能给你,为其他人阅读也会提供很好的支持.细致恰当的命名规则就可以看出作者的功力. 2)更好更高的软件性能体现在架构设计上,好的架构会让软件更加稳定.容易维护.便于扩展.从核心模块

转 深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇)

深入浅出Mybatis系列(十)---SQL执行流程分析(源码篇) 最近太忙了,一直没时间继续更新博客,今天忙里偷闲继续我的Mybatis学习之旅.在前九篇中,介绍了mybatis的配置以及使用, 那么本篇将走进mybatis的源码,分析mybatis 的执行流程, 好啦,鄙人不喜欢口水话,还是直接上干活吧: 1. SqlSessionFactory 与 SqlSession. 通过前面的章节对于mybatis 的介绍及使用,大家都能体会到SqlSession的重要性了吧, 没错,从表面上来看,

Android源码分析--MediaServer源码分析(二)

在上一篇博客中Android源码分析–MediaServer源码分析(一),我们知道了ProcessState和defaultServiceManager,在分析源码的过程中,我们被Android的Binder通信机制中的各种复杂的类关系搞的眼花缭乱,接下来我们就以MediaPlayerService为例来分析一下Binder的通信机制.首先来回顾一下: BpBinder和BBinder都是Android中Binder通信的代表类,其中BpBinder是客户端用来与Server交互的代理类,p代

OpenStack_Swift源码分析——ObjectReplicator源码分析(1)

1.ObjectorReplicator的启动 首先运行启动脚本 swift-init object-replicator start 此运行脚本的运行过程和ring运行脚本运行过程差不多,找到swift 源码bin下的swift-object-replicator其代码如下所示 if __name__ == '__main__': parser = OptionParser("%prog CONFIG [options]") parser.add_option('-d', '--de

OpenStack_Swift源码分析——ObjectReplicator源码分析(2)

1.Replicator执行代码详细分析 上篇问中介绍了启动Replicator的具体过程,下面讲解Replicator的执行代码的具体实现,首先看replicate方法: def replicate(self, override_devices=None, override_partitions=None): """Run a replication pass""" self.start = time.time() self.suffix_co

SpringMVC核心分发器DispatcherServlet分析[附带源码分析]

SpringMVC核心分发器DispatcherServlet分析[附带源码分析] 目录 前言 DispatcherServlet初始化过程 DispatcherServlet处理请求过程 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 本文将分析SpringMVC的核心分发器Dispa