thinkphp3.2 執行流程
//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
相關文章
- MyBatis執行流程MyBatis
- HA執行流程
- MapReduce執行流程
- Mysql 執行流程MySql
- SpringMVC執行流程SpringMVC
- 「MySQL」 MySQL執行流程MySql
- javaWeb的執行流程JavaWeb
- MapReduce程式執行流程
- Dapr Outbox 執行流程
- Ansible playbook 執行流程
- for 迴圈執行流程
- Spark學習(一)——執行模式與執行流程Spark模式
- 深入理解執行緒池的執行流程執行緒
- SQL 解析與執行流程SQL
- PHP執行流程回顧PHP
- 框架執行流程總結框架
- MapReduce的執行流程概述
- 執行流程原始碼分析原始碼
- SpringMvc - SpringMvc的執行流程SpringMVC
- eBPF 執行原理和流程eBPF
- WEB程式執行的基本流程Web
- 【java學習】控制執行流程Java
- Ansible ad-hoc 執行流程
- 深入Mybatis原始碼——執行流程MyBatis原始碼
- Seata的AT模式的執行流程模式
- Mybatis執行流程原始碼分析MyBatis原始碼
- MySQL基礎架構執行流程MySql架構
- mysql的sql語句執行流程MySql
- Shiro(認證的執行流程Authentication)
- Facades 原理 (程式碼執行流程分析)
- 執行緒池的工作流程執行緒
- Mybatis原始碼系列 執行流程(一)MyBatis原始碼
- 從ReentrantLock看AQS (AbstractQueuedSynchronizer) 執行流程ReentrantLockAQS
- Servlet基本概念及執行流程Servlet
- Java類初始化執行流程Java
- SpringMVC執行流程及原始碼分析SpringMVC原始碼
- 死磕 java執行緒系列之執行緒池深入解析——普通任務執行流程Java執行緒
- 死磕 java執行緒系列之執行緒池深入解析——未來任務執行流程Java執行緒