• 一 分析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);//会去系统配置文件中是否有用户自定义的错误处理函数,在系统vendoreasyswooleeasyswoolesrcCoreComponentSysConst.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中止时执行的函数,在系统vendoreasyswooleeasyswoolesrcCoreComponentSysConst.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 = EasySwooleCoreComponentDi::getInstance()->get(EasySwooleCoreComponentSysConst::VERSION);
        echo "
    e[31mEasySwoolee[0m framework e[34mVersion {$version}e[0m
    
    ";//在这个文档的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();//这里是核心。下篇文档进行分析
  • 相关阅读:
    简单的远程控制软件
    VS集成环境中的JavaScript脚本语法检查
    vs2022安装
    有关httpContext.Current.Session[值] 取值的问题
    【python3.7】文件操作
    148. 排序链表
    11. 盛最多水的容器
    23. 合并K个升序链表
    147. 对链表进行插入排序
    146. LRU 缓存机制
  • 原文地址:https://www.cnblogs.com/gavinjunftd/p/9430167.html
Copyright © 2020-2023  润新知