框架啟動(dòng)流程
一、自動(dòng)加載
我們?cè)趫?zhí)行如下命令的時(shí)候:
php easyswoole.php server start
項(xiàng)目目錄下的 easyswoole
這個(gè)文件,會(huì)搜索項(xiàng)目目錄下是否存在 composer
所生成的 autoload.php
這個(gè)文件,用于實(shí)現(xiàn) psr-4
自動(dòng)加載,當(dāng)文件不存在的時(shí)候,則終止框架啟動(dòng)。
二、基礎(chǔ)常量定義
在搜索到了 autoload.php
文件后,框架啟動(dòng)腳本則會(huì)認(rèn)定為已經(jīng)成功注冊(cè)了 composer
的自動(dòng)加載機(jī)制,隨后,會(huì)根據(jù)autoload.php
所在的位置,進(jìn)行如下幾個(gè)常量的預(yù)定義。
-
IN_PHAR
定義規(guī)則為
defined('IN_PHAR') or define('IN_PHAR', boolval(\Phar::running(false)));
,該常量可以用于判定當(dāng)前服務(wù)是否在PHAR
環(huán)境中。 -
RUNNING_ROOT
定義規(guī)則為
defined('RUNNING_ROOT') or define('RUNNING_ROOT', $realCwd);
,該常量可以用于定義當(dāng)前服務(wù)運(yùn)行的根目錄,是一個(gè)絕對(duì)路徑。 -
EASYSWOOLE_ROOT
定義規(guī)則為
defined('EASYSWOOLE_ROOT') or define('EASYSWOOLE_ROOT', IN_PHAR ? \Phar::running() : $realCwd);
,該常量用于定義當(dāng)前項(xiàng)目所在路徑的根目錄,是一個(gè)絕對(duì)路徑。
三、bootstrap 文件引入
EasySwoole
啟動(dòng)腳本會(huì)判斷在項(xiàng)目根目錄下,也就是 EASYSWOOLE_ROOT.'/bootstrap.php'
這個(gè)文件是否存在,如果存在,那么則會(huì)執(zhí)行一次 require_once
。用戶可以在框架沒(méi)有做任何的真實(shí)初始化之前,做自己的預(yù)處理或者是預(yù)定義。(注:3.4.x及以上版本在框架安裝時(shí)會(huì)自動(dòng)生成一個(gè) bootstrap
文件在項(xiàng)目根目錄,3.4.x 之前的版本需要用戶自行添加。)
四、啟動(dòng)命令解析
EasySwoole
主框架定義了一個(gè)命令容器,完整命名空間為 \EasySwoole\EasySwoole\Command\CommandRunner
,這個(gè)是一個(gè)單例對(duì)象,是對(duì) \EasySwoole\Command\CommandManager
對(duì)象的進(jìn)一步調(diào)用封裝。在對(duì)象的構(gòu)造函數(shù)中,默認(rèn)注冊(cè)了 EasySwoole
自帶的幾個(gè)命令:
- Crontab
- Install
- PhpUnit
- Process
- Server
- Task
以如下啟動(dòng)命令為例:
php easyswoole.php server start -d
-d 可選,為守護(hù)啟動(dòng)參數(shù)
CommandRunner
會(huì)執(zhí)行 server
命令的 start
行為,其中,server
命令的完整實(shí)現(xiàn)在 \EasySwoole\EasySwoole\Command\DefaultCommand\Server
。
Server 主命令
server
主命令被執(zhí)行時(shí),做了以下操作:
- 判斷是否指定了運(yùn)行模式
$mode = CommandManager::getInstance()->getOpt('mode'); if(!empty($mode)){ Core::getInstance()->runMode($mode); }
- 執(zhí)行框架的初始化
\EasySwoole\EasySwoole\Core::getInstance()->initialize()
Start 行為
在 start
行為中,做了如下兩件事:
- 獲取配置對(duì)象并設(shè)置運(yùn)行時(shí)必須參數(shù)
- 執(zhí)行框架的最終啟動(dòng)
\EasySwoole\EasySwoole\Core::getInstance()->createServer()->start();