標籤:開始 dir cache php檔案 記錄 dsl ons 手工 common
正如官方文檔上所介紹的,thinkphp使用單一入口,所有的請求都從預設的index.php檔案進入。當然不是說一定非得從index.php進入,這應該取決於你的伺服器配置,一般伺服器都會有預設的首頁,比如index.php,index.html,所以一般訪問網域名稱都會先預設訪問上述檔案,你還可以建立多個應用,一個應用對應一個入口檔案,所有的入口檔案都引用一套thinkphp類庫。
我們來看index.php都幹了些什麼. index.php主要任務是定義應用程式名稱和引用類庫路徑。當然也可以定義一些其他的系統常量。
// 檢測PHP環境if(version_compare(PHP_VERSION,‘5.3.0‘,‘<‘)) die(‘require PHP > 5.3.0 !‘);// 開啟偵錯模式 建議開發階段開啟 部署階段注釋或者設為falsedefine(‘APP_DEBUG‘,True);// 定義應用目錄define(‘APP_PATH‘,‘./test/‘);// 引入ThinkPHP入口檔案require ‘./ThinkPHP/ThinkPHP.php‘;
thinkphp官方建議在實際部署應用的時候,我們建議除了應用入口檔案和Public資源目錄外,其他檔案都放到非WEB目錄下面,具有更好的安全性。
接下來就應該是ThinkPHP.php檔案,這個檔案主要是用於架構環境的一些設定,包括常用路徑,版本檢測,系統資訊等。
<?php // 記錄開始已耗用時間$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.2‘; // URL 模式定義const URL_COMMON = 0; //普通模式const URL_PATHINFO = 1; //PATHINFO模式const URL_REWRITE = 2; //REWRITE模式const URL_COMPAT = 3; // 相容模式 // 類檔案尾碼const EXT = ‘.class.php‘; // 系統常量定義//定義當前入口檔案所在的目錄,即thinkphp架構的目錄defined(‘THINK_PATH‘) or define(‘THINK_PATH‘, __DIR__.‘/‘);//定義網站應用程式所在的目錄。一般來說,在index.php檔案中我們會定義一下應用路徑,如果說我們在index.php檔案中沒有定義APP_PATH,那麼這裡就會執行define(‘APP_PATH‘, dirname($_SERVER[‘SCRIPT_FILENAME‘]).‘/‘);這裡會擷取當前執行指令碼的伺服器端的絕對路徑。一般是index.php檔案所在的目錄。在我的電腦上即D:/phpStudy/WWW/thinkphp/,即網站的根目錄。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); // 是否偵錯模式 /*這裡定義應用模式。到底什麼是應用模式?thinkphp架構為開發人員提供了更改核心架構的機會。我們知道一個php架構的核心是定義一些重要的設定檔,引入一些重要的類庫和函數以及適應當前主機環境的的php配置等。所以我們可以把這些核心中需要引入的檔案代碼分離出來,全部定義在一個php設定檔中,這個php設定檔就叫做模式的設定檔。然後我們根據模式不同去引用對應的設定檔,分析設定檔中的配置項,並運行之,從而達到改變架構核心的目的。就拿最為常用的普通模式來說明。我們在入口檔案中定義了app_mode為common,然後在執行thinkphp的start方法的時候就會去分析定義的模式名稱並且根據模式名稱去mode檔案夾下去尋找模式對應的common.php檔案, // 讀取應用模式 $mode = include is_file(CONF_PATH.‘core.php‘)?CONF_PATH.‘core.php‘:MODE_PATH.APP_MODE.‘.php‘;在此檔案中定義了用於擴充核心的配置項,在引入了這個檔案後,我們可以查看start方法後續就會一一去引入配置項中所定義的各個檔案。與此同時,tp預設支援SAE環境,也就是說官方已經給我們寫好了SAE環境的核心架構擴充的代碼,只帶適當的時候觸發。*/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‘).‘/‘); // 系統核心類庫目錄defined(‘CORE_PATH‘) or define(‘CORE_PATH‘, LIB_PATH.‘Think/‘); // 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‘, ‘‘); // 設定檔解析方法 // 系統資訊/*在magic_quotes_gpc=On的情況下,如果輸入的資料有單引號(’)、雙引號(”)、反斜線()與 NUL(NULL 字元)等字元都會被加上反斜線。這些轉義是必須的,如果這個選項為off,那麼我們就必須調用addslashes這個函數來為字串增加轉義。在php5.4以後就廢除了此特性。所以我們在以後就不要依靠這個特性了。為了使自己的程式不管伺服器是什麼設定都能正常執行。可以在程式開始用get_magic_quotes_runtime檢測該設定的狀態決定是否要手工處理,或者在開始(或不需要自動轉義的時候)用set_magic_quotes_runtime(0)關掉該設定。判斷php版本,小於5.4的就手動關掉,定義常量。大於5.4直接定義常量為false。*/if(version_compare(PHP_VERSION,‘5.4.0‘,‘<‘)) { ini_set(‘magic_quotes_runtime‘,0); define(‘MAGIC_QUOTES_GPC‘,get_magic_quotes_gpc()?True:False);}else{ define(‘MAGIC_QUOTES_GPC‘,false);}/*php判斷解析php服務是由那種伺服器軟體,是採用那種協議,PHP_ASPI是一個可以直接使用的常量。如果是nginx+fastcgi環境,那麼它的值是cgi-fcgi如果是apache環境,那麼他的值是apache2handler如果是命令列的形式,那麼它的值是cliPHP_OS PHP所在的作業系統的名字,例如linux和WIN。充分理解php的各種運行模式,參看:http://www.jb51.net/article/37756.htmhttp://www.cnblogs.com/liuzhang/p/3929198.html*/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();
Thinkphp源碼分析系列(一)–入口檔案