thinkphp3.2 執行流程

DanaSwan發表於2018-11-06
//1.入口檔案   index.php
  
//首頁入口檔案

//檢測PHP 環境

if (version_compare(PHP_VERSION, '5.3.0', '<')) die('require PHP > 5.3.0 !') ;

//是否開啟除錯模式

define('APP_DEBUG', true);

//定義應用目錄

define('APP_PATH', './Application/');

//引入ThinkPHP框架

require './ThinkPHP/ThinkPHP.php';

 

// 2.ThinkPHP公共入口檔案

// 記錄開始執行時間

$GLOBALS['_beginTime'] = microtime(true);

// 記錄記憶體初始使用
define('MEMORY_LIMIT_ON', function_exists('memory_get_usage'));

if (MEMORY_LIMIT_ON) {
    $GLOBALS['_startUseMems'] = memory_get_usage();
}

// 版本資訊
const THINK_VERSION = '3.2.4';

// URL 模式定義
const URL_COMMON   = 0; //普通模式
const URL_PATHINFO = 1; //PATHINFO模式
const URL_REWRITE  = 2; //REWRITE模式
const URL_COMPAT   = 3; // 相容模式




// 類檔案字尾
const EXT = '.class.php';

// 系統常量定義
defined('THINK_PATH') or define('THINK_PATH', __DIR__ . '/');
defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . '/');

defined('APP_STATUS') or define('APP_STATUS', ''); // 應用狀態 載入對應的配置檔案
defined('APP_DEBUG') or define('APP_DEBUG', false); // 是否除錯模式

if (function_exists('saeAutoLoader')) {
// 自動識別SAE環境
    defined('APP_MODE') or define('APP_MODE', 'sae');
    defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'Sae');
} else {
    defined('APP_MODE') or define('APP_MODE', 'common'); // 應用模式 預設為普通模式
    defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'File'); // 儲存型別 預設為File
}

// 系統執行時目錄
defined('RUNTIME_PATH') or define('RUNTIME_PATH', APP_PATH . 'Runtime/');
// 系統核心類庫目錄
defined('LIB_PATH') or define('LIB_PATH', realpath(THINK_PATH . 'Library') . '/'); 
// Think類庫目錄
defined('CORE_PATH') or define('CORE_PATH', LIB_PATH . 'Think/'); 
// 行為類庫目錄
defined('BEHAVIOR_PATH') or define('BEHAVIOR_PATH', LIB_PATH . 'Behavior/'); 
// 系統應用模式目錄
defined('MODE_PATH') or define('MODE_PATH', THINK_PATH . 'Mode/'); 
 // 第三方類庫目錄
defined('VENDOR_PATH') or define('VENDOR_PATH', LIB_PATH . 'Vendor/');
// 應用公共目錄
defined('COMMON_PATH') or define('COMMON_PATH', APP_PATH . 'Common/'); 
// 應用配置目錄
defined('CONF_PATH') or define('CONF_PATH', COMMON_PATH . 'Conf/');
// 應用語言目錄 
defined('LANG_PATH') or define('LANG_PATH', COMMON_PATH . 'Lang/'); 
// 應用靜態目錄
defined('HTML_PATH') or define('HTML_PATH', APP_PATH . 'Html/'); 
// 應用日誌目錄
defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'Logs/'); 
// 應用快取目錄
defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH . 'Temp/');
// 應用資料目錄 
defined('DATA_PATH') or define('DATA_PATH', RUNTIME_PATH . 'Data/'); 
// 應用模板快取目錄
defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH . 'Cache/'); 
// 配置檔案字尾
defined('CONF_EXT') or define('CONF_EXT', '.php'); 
// 配置檔案解析方法
defined('CONF_PARSE') or define('CONF_PARSE', ''); 

defined('ADDON_PATH') or define('ADDON_PATH', APP_PATH . 'Addon');


// 系統資訊
if (version_compare(PHP_VERSION, '5.4.0', '<')) {
   
  //當遇到反斜杆(\)、單引號(')、雙引號(")這樣一些的字元定入到資料庫裡,又不想被過濾掉,使用
  //這個函式(magic_quotes_runtime),將會自動加上一個反斜杆(\),保護系統和資料庫的安全。

   ini_set('magic_quotes_runtime', 0);

   define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc() ? true : false);
} else {
    define('MAGIC_QUOTES_GPC', false);
}


define('IS_CGI', (0 === strpos(PHP_SAPI, 'cgi') || false !== strpos(PHP_SAPI, 'fcgi')) ? 1 : 0);
define('IS_WIN', strstr(PHP_OS, 'WIN') ? 1 : 0);
define('IS_CLI', PHP_SAPI == 'cli' ? 1 : 0);

if (!IS_CLI) {
    // 當前檔名
    if (!defined('_PHP_FILE_')) {
        if (IS_CGI) {
            //CGI/FASTCGI模式下
            $_temp = explode('.php', $_SERVER['PHP_SELF']);
            define('_PHP_FILE_', rtrim(str_replace($_SERVER['HTTP_HOST'], '', $_temp[0] . '.php'), '/'));
        } else {
            define('_PHP_FILE_', rtrim($_SERVER['SCRIPT_NAME'], '/'));
        }
    }
    if (!defined('__ROOT__')) {
        $_root = rtrim(dirname(_PHP_FILE_), '/');
        define('__ROOT__', (('/' == $_root || '\\' == $_root) ? '' : $_root));
    }
}



// 載入核心Think類
require CORE_PATH . 'Think' . EXT;
// 應用初始化
Think\Think::start();


解析 :

get_magic_quotes_gpc()

返回值: 長整數

本函式取得 PHP 環境配置的變數 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示關閉本功能;返回 1 表示本功能開啟。當 magic_quotes_gpc 開啟時,所有的 ' (單引號), " (雙引號), (反斜線) and 空字元會自動轉為含有反斜線的溢位字元。



3.Think.class.php

 // 註冊AUTOLOAD方法
 spl_autoload_register('Think\Think::autoload');
 // 設定錯誤和異常處理
 register_shutdown_function('Think\Think::fatalError');
 set_error_handler('Think\Think::appError');
 set_exception_handler('Think\Think::appException');
 // 初始化檔案儲存方式
 Storage::connect(STORAGE_TYPE);

// 如果有 $runtimefile 同時 開啟 APP_DEBUG 

 if (!APP_DEBUG && Storage::has($runtimefile)) {
        Storage::load($runtimefile);
 }else{


        // 讀取應用模式

        // 載入核心檔案

        // 載入應用模式配置檔案

        // 讀取當前應用模式對應的配置檔案

        // 載入應用別名定義檔案

        // 載入模式行為定義

        // 載入應用行為定義

        // 載入框架底層語言包

    }

// 讀取當前應用狀態對應的配置檔案

// 設定系統時區

// 檢查應用目錄結構 如果不存在則自動建立

// 記錄載入檔案時間

// 執行應用
4. App.class.php

    /**
     * 執行應用例項 入口檔案使用的快捷方法
     * @access public
     * @return void
     */
    public static function run()
    {
        // 載入動態應用公共檔案和配置
        load_ext_file(COMMON_PATH);
        // 應用初始化標籤
        Hook::listen('app_init');
        App::init();
        // 應用開始標籤
        Hook::listen('app_begin');
        // Session初始化
        if (!IS_CLI) {
            session(C('SESSION_OPTIONS'));
        }
        // 記錄應用初始化時間
        G('initTime');
        App::exec();
        // 應用結束標籤
        Hook::listen('app_end');
        return;
    }


run()方法:

    ①App::init();  

    load_ext_file載入應用的公共檔案(./Application/Common/Common/)配置(./Application/Common/Conf)

    Think\Dispatcher::dispatch();  URL解析,獲取控制器index、方法index

    ②App::exec(); 執行應用程式,及新建控制器HomeConstroller的例項,即物件;

    建立控制器例項:$module  =  controller(CONTROLLER_NAME,CONTROLLER_PATH); 即=new IndexController();

    利用php反射機制獲取action方法物件,$method =   new \ReflectionMethod($module, $action);

    執行這個方法:$method->invoke($module); //無引數時執行,訪問首頁預設執行這個

            $method->invokeArgs($module,$args); //有引數時執行;

    以上即執行了控制器 ./Application/Home/Controller/IndexController.class.php 中的index方法

參考文件:https://www.cnblogs.com/gamir/p/4264930.html

                 https://www.cnblogs.com/Sunlight1992/p/4545174.html

 

相關文章