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