天天看點

ThinkPHP3.0啟動過程

以Blog舉例

載入項目入口檔案

    D:\wamp\www\Examples\Blog\index.php

        定義常量

        APP_NAME,Blog

        APP_PATH,D:\wamp\www\Examples\Blog\ (APP_PATH為項目核心架構結構檔案(lib)所在目錄)

載入ThinkPHP架構入口檔案

    D:\wamp\www\ThinkPHP\ThinkPHP.php

        記錄開始運作時間,記錄記憶體使用情況

        檢查項目是否定義常量APP_PATH,(如果沒有定義為目錄D:\wamp\www\ThinkPHP\)

        根據APP_PATH定義常量RUNTIME_PATH,D:\wamp\www\Examples\Blog\Runtime\

        檢查項目是否定義常量APP_DEBUG,false (如果沒有定義為false)

        檢查項目是否定義常量MODE_NAME,~runtime.php (如果沒有定義為~runtime.php)

        定義常量RUNTIME_FILE,D:\wamp\www\Examples\Blog\Runtime\~runtime.php

        如果非調試并存在RUNTIME_FILE,直接加載D:\wamp\www\Examples\Blog\Runtime\~runtime.php

        如果現在還沒有這個檔案

        定義常量THINK_PATH,D:\wamp\www\ThinkPHP\ThinkPHP\

加載運作時檔案

    D:\wamp\www\ThinkPHP\ThinkPHP\Common\runtime.php

        檢查是否定義常量THINK_PATH,沒定義就終止程式

        檢查PHP版本,如果小于5.2.0終止程式執行

        定義常量THINK_VERSION,3.0

        定義常量THINK_RELEASE,20120323

        根據PHP版本設定魔術引号

        定義常量MAGIC_QUOTES_GPC,False

        定義常量IS_CGI,0

        定義常量IS_WIN,1

        定義常量IS_CLI,0

        檢查是否定義APP_NAME

        PHP非CLI模式下

            定義常量_PHP_FILE_,/Examples/Blog/index.php

            定義常量__ROOT__,/Examples

            定義常量URL_COMMON,      0

            定義常量URL_PATHINFO,    1

            定義常量URL_REWRITE,     2

            定義常量URL_COMPAT,      3

        路徑設定 可在項目或者THINKPHP入口檔案中重新定義 所有路徑常量都必須以/ 結尾

        定義常量ENGINE_PATH, D:\wamp\www\ThinkPHP/Extend/Engine/

        定義常量VENDOR_PATH, D:\wamp\www\ThinkPHP/Extend/Vendor/

        定義常量LIBRARY_PATH,D:\wamp\www\ThinkPHP/Extend/Library/

        定義常量COMMON_PATH, D:\wamp\www\Examples\Blog\Common/

        定義常量LIB_PATH,    D:\wamp\www\Examples\Blog\Lib/

        定義常量CONF_PATH,   D:\wamp\www\Examples\Blog\Conf/

        定義常量LANG_PATH,   D:\wamp\www\Examples\Blog\Lang/

        定義常量TMPL_PATH,   D:\wamp\www\Examples\Blog\Tpl/

        定義常量HTML_PATH,   D:\wamp\www\Examples\Blog\Html/

        定義常量LOG_PATH,    D:\wamp\www\Examples\Blog\Runtime/Logs/

        定義常量TEMP_PATH,   D:\wamp\www\Examples\Blog\Runtime/Temp/

        定義常量DATA_PATH,   D:\wamp\www\Examples\Blog\Runtime/Data/

        定義常量CACHE_PATH,  D:\wamp\www\Examples\Blog\Runtime/Cache/

        設定VENDOR_PATH目錄到include_path

        定義初始化方法,build_app_dir,build_first_action,build_runtime_cache,build_tags_cache,check_runtime,load_runtime_file

        調用load_runtime_file方法

            加載基礎函數檔案common.php,D:\wamp\www\ThinkPHP\Common/common.php

            加載核心編譯檔案

            D:\wamp\www\ThinkPHP/Lib/Core/Think.class.php

            D:\wamp\www\ThinkPHP/Lib/Core/ThinkException.class.php

            D:\wamp\www\ThinkPHP/Lib/Core/Behavior.class.php

            把别名配置檔案導入别名靜态變量$_alias,别名配置檔案為D:\wamp\www\ThinkPHP\Conf/alias.php

            如果目錄D:\wamp\www\Examples\Blog\Lib/不存在,建立預設項目檔案結構及config.php和IndexAction.class.php檔案

            如果存在就檢查項目的緩存目錄D:\wamp\www\Examples\Blog\Runtime/Cache/。不存在就建立預設檔案結構。

            如果是調試模式,删除RUNTIME_FILE定義的檔案

        記錄加載檔案時間

        執行Think::Start()

該方法在核心檔案D:\wamp\www\ThinkPHP/Lib/Core/Think.class.php類裡

    設定錯誤和異常處理,appError,appException

    注冊AUTOLOAD方法,autoload

    執行Think::builApp方法

        把慣例配置檔案導入配置靜态變量$_config,慣例配置檔案為D:\wamp\www\ThinkPHP\Conf/convention.php

        如果定義常量MODE_NAME,則到D:\wamp\www\ThinkPHP/Extend/Mode/目錄下導入對應的模式配置檔案到變量$mode

        如果模式配置配置檔案有config項,就導入到配置靜态變量$_config

        把項目配置配置檔案D:\wamp\www\Examples\Blog\Conf/config.php導入配置靜态變量$_config

        加載頂層語言包D:\wamp\www\ThinkPHP\Lang\zh-cn.php到語言靜态變量$_lang

        系統行為定義如下:

        如果靜态配置變量中有APP_TAGS_ON,并且為true,加載變量$mode的extends項到配置靜态變量$_config的extends下,變量$mode沒有extends項,

        把系統配置下的tags.php導入到配置靜态變量$_config的extends下,D:\wamp\www\ThinkPHP\Conf/tags.php

        項目行為定義如下:

        加載變量$mode的extends項到配置靜态變量$_config的tags下,變量$mode沒有tags項,

        把項目配置下的tags.php導入到配置靜态變量$_config的tags下,D:\wamp\www\Examples\Blog\Conf/tags.php

        讀取核心編譯檔案如下:

        如果變量$mode定義core,核心檔案為該項,如果沒有定義,核心檔案則為

        D:\wamp\www\ThinkPHP\Common/functions.php

        D:\wamp\www\ThinkPHP/Lib/Core/Log.class.php

        D:\wamp\www\ThinkPHP/Lib/Core/Dispatcher.class.php

        D:\wamp\www\ThinkPHP/Lib/Core/App.class.php

        D:\wamp\www\ThinkPHP/Lib/Core/Action.class.php

        D:\wamp\www\ThinkPHP/Lib/Core/View.class.php

        把項目核心配置定義D:\wamp\www\Examples\Blog\Conf/core.php的數組及以上檔案儲存到變量$list

        依次加載核心檔案

        非調試模式時把這些核心檔案寫入變量$compile

        附加元件目公共檔案D:\wamp\www\Examples\Blog\Common/common.php

        非調試模式時把項目公共檔案寫入變量$compile

        把變量$mode的alias項導入别名靜态變量$_alias

        非調試模式時把變量$mode的alias項寫入變量$compile

        把項目别名檔案導入别名靜态變量$_alias,D:\wamp\www\Examples\Blog\Conf/alias.php

        非調試模式時把項目别名檔案的alias項寫入變量$compile

        如果是調試環境,

            把系統調試配置檔案導入配置靜态變量$_config,D:\wamp\www\ThinkPHP\ThinkPHP\Conf/debug.php

            取出APP_STATUS配置,附加元件目配置調試配置檔案 D:\wamp\www\Examples\Blog\Conf/$status.php

        如果非調試模式,調用build_runtime_cache函數生成編譯檔案

            基本上将語言包,配置,别名,核心函數,defined變量,D:\wamp\www\ThinkPHP/Lib/Behavior/裡的由extends定義的類,生成一個檔案~runtime.php

    執行APP::run方法

        根據extends和tags記錄的app_init項,執行個體化行為

        設定時區

        如果配置靜态變量$_config有LOAD_EXT_FILE項,則動态在D:\wamp\www\Examples\Blog\Common/目錄下加載檔案

        如果配置靜态變量$_config有LOAD_EXT_CONFIG項,則動态在D:\wamp\www\Examples\Blog\Conf/目錄下加載檔案到靜态變量$_config

        執行Dispatcher::dispatch方法

            這裡代碼太多~~~不好了解

        如果定了分組,根據分組加載配置和函數

        定義模闆相關常量

        根據extends和tags記錄的app_begin項,執行個體化行為

        根據配置靜态變量$_config的SESSION_OPTIONS項session初始化

            根據SESSION_TYPE到D:\wamp\www\ThinkPHP/Extend/Driver\Session/目錄下加載對應的類并執行個體化,執行執行個體的execute方法

        記錄應用初始化時間

        執行mvc流程,

            涉及__hack_module方法和Empty子產品

            執行action_name行為

            執行該子產品對應動作的_before_action方法

            執行子產品對應動作

            執行該子產品對應動作的_after_action方法

        根據extends和tags記錄的app_end項,執行個體化行為

        儲存日志記錄

附錄:

    自動加載

        先從别名靜态配置變量$_alias裡查找,如果有直接加載

        如果是Behavior類,從D:\wamp\www\ThinkPHP/Lib/Behavior/目錄,D:\wamp\www\ThinkPHP/Extend/Behavior/目錄,D:\wamp\www\Examples\Blog\Lib/Behavior/,模式目錄的/Behavior/目錄查找

        如果是Model類,從D:\wamp\www\Examples\Blog\Lib/Model/目錄,D:\wamp\www\ThinkPHP/Extend/Model/目錄查找

        如果是Action類,從D:\wamp\www\Examples\Blog\Lib/Action/目錄,D:\wamp\www\ThinkPHP/Extend/Action/目錄查找

        根據配置靜态變量$_config的APP_AUTOLAOD_PATH項自動加載

    配置檔案順序

        系統别名 alias.php

        系統慣例 convention.php

        系統模式配置檔案 例如cli.php

        項目配置檔案 config.php

        語言封包件 zh-cn.php

        系統行為檔案 tags.php

        項目行為檔案 tags.php

        項目核心配置 core.php

        項目别名 alias.php

        系統調試配置檔案 debug.php

        項目調試配置,$status.php