一 分析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();//這裏是核心。下篇文檔進行分析
相關文章
相關標籤/搜索