ThinkPHP3.2 加載過程(二)

原文: ThinkPHP3.2 加載過程(二)

回顧:php

  上次介紹了 ThinkPHP 的 Index.PHP入口文件。但只是TP的入口前面的入口(刷boss老是要過好幾關才能讓你看到 ,否則boss都沒面子啊),從Index.PHP最後一行把咱們引路到了TP的大門前(ThinkPHP/ThinkPHP.php)html

// 引入ThinkPHP入口文件
require './ThinkPHP/ThinkPHP.php';

 

本次目標:ajax

  查看TP的大門,同時稍微探索一下大門內部的東西thinkphp

 

正文:數據庫

  先上代碼數組

 1 // 記錄開始運行時間
 2 $GLOBALS['_beginTime'] = microtime(TRUE);
 3 // 記錄內存初始使用
 4 define('MEMORY_LIMIT_ON',function_exists('memory_get_usage'));
 5 if(MEMORY_LIMIT_ON) $GLOBALS['_startUseMems'] = memory_get_usage();
 6 
 7 // 版本信息
 8 const THINK_VERSION     =   '3.2.3';
 9 
10 // URL 模式定義
11 const URL_COMMON        =   0;  //普通模式
12 const URL_PATHINFO      =   1;  //PATHINFO模式
13 const URL_REWRITE       =   2;  //REWRITE模式
14 const URL_COMPAT        =   3;  // 兼容模式
15 
16 // 類文件後綴
17 const EXT               =   '.class.php'; 
18 
19 // 系統常量定義
20 defined('THINK_PATH')   or define('THINK_PATH',     __DIR__.'/');
21 defined('APP_PATH')     or define('APP_PATH',       dirname($_SERVER['SCRIPT_FILENAME']).'/');
22 defined('APP_STATUS')   or define('APP_STATUS',     ''); // 應用狀態 加載對應的配置文件
23 defined('APP_DEBUG')    or define('APP_DEBUG',      false); // 是否調試模式
24 
25 if(function_exists('saeAutoLoader')){// 自動識別SAE環境
26     defined('APP_MODE')     or define('APP_MODE',      'sae');
27     defined('STORAGE_TYPE') or define('STORAGE_TYPE',  'Sae');
28 }else{
29     defined('APP_MODE')     or define('APP_MODE',       'common'); // 應用模式 默認爲普通模式    
30     defined('STORAGE_TYPE') or define('STORAGE_TYPE',   'File'); // 存儲類型 默認爲File    
31 }
32 
33 defined('RUNTIME_PATH') or define('RUNTIME_PATH',   APP_PATH.'Runtime/');   // 系統運行時目錄
34 defined('LIB_PATH')     or define('LIB_PATH',       realpath(THINK_PATH.'Library').'/'); // 系統核心類庫目錄
35 defined('CORE_PATH')    or define('CORE_PATH',      LIB_PATH.'Think/'); // Think類庫目錄
36 defined('BEHAVIOR_PATH')or define('BEHAVIOR_PATH',  LIB_PATH.'Behavior/'); // 行爲類庫目錄
37 defined('MODE_PATH')    or define('MODE_PATH',      THINK_PATH.'Mode/'); // 系統應用模式目錄
38 defined('VENDOR_PATH')  or define('VENDOR_PATH',    LIB_PATH.'Vendor/'); // 第三方類庫目錄
39 defined('COMMON_PATH')  or define('COMMON_PATH',    APP_PATH.'Common/'); // 應用公共目錄
40 defined('CONF_PATH')    or define('CONF_PATH',      COMMON_PATH.'Conf/'); // 應用配置目錄
41 defined('LANG_PATH')    or define('LANG_PATH',      COMMON_PATH.'Lang/'); // 應用語言目錄
42 defined('HTML_PATH')    or define('HTML_PATH',      APP_PATH.'Html/'); // 應用靜態目錄
43 defined('LOG_PATH')     or define('LOG_PATH',       RUNTIME_PATH.'Logs/'); // 應用日誌目錄
44 defined('TEMP_PATH')    or define('TEMP_PATH',      RUNTIME_PATH.'Temp/'); // 應用緩存目錄
45 defined('DATA_PATH')    or define('DATA_PATH',      RUNTIME_PATH.'Data/'); // 應用數據目錄
46 defined('CACHE_PATH')   or define('CACHE_PATH',     RUNTIME_PATH.'Cache/'); // 應用模板緩存目錄
47 defined('CONF_EXT')     or define('CONF_EXT',       '.php'); // 配置文件後綴
48 defined('CONF_PARSE')   or define('CONF_PARSE',     '');    // 配置文件解析方法
49 defined('ADDON_PATH')   or define('ADDON_PATH',     APP_PATH.'Addon');
50 
51 // 系統信息
52 if(version_compare(PHP_VERSION,'5.4.0','<')) {
53     ini_set('magic_quotes_runtime',0);
54     define('MAGIC_QUOTES_GPC',get_magic_quotes_gpc()? true : false);
55 }else{
56     define('MAGIC_QUOTES_GPC',false);
57 }
58 define('IS_CGI',(0 === strpos(PHP_SAPI,'cgi') || false !== strpos(PHP_SAPI,'fcgi')) ? 1 : 0 );
59 define('IS_WIN',strstr(PHP_OS, 'WIN') ? 1 : 0 );
60 define('IS_CLI',PHP_SAPI=='cli'? 1   :   0);
61 
62 if(!IS_CLI) {
63     // 當前文件名
64     if(!defined('_PHP_FILE_')) {
65         if(IS_CGI) {
66             //CGI/FASTCGI模式下
67             $_temp  = explode('.php',$_SERVER['PHP_SELF']);
68             define('_PHP_FILE_',    rtrim(str_replace($_SERVER['HTTP_HOST'],'',$_temp[0].'.php'),'/'));
69         }else {
70             define('_PHP_FILE_',    rtrim($_SERVER['SCRIPT_NAME'],'/'));
71         }
72     }
73     if(!defined('__ROOT__')) {
74         $_root  =   rtrim(dirname(_PHP_FILE_),'/');
75         define('__ROOT__',  (($_root=='/' || $_root=='\\')?'':$_root));
76     }
77 }
78 
79 // 加載核心Think類
80 require CORE_PATH.'Think'.EXT;
81 // 應用初始化 
82 Think\Think::start();

解釋:瀏覽器

  1 - 5 行:初始化  運行的時間  內存之類的東東,給開發人員提供代碼運行效率直觀上的體現緩存

  8       行:不猜也能知道  就是版本好的說明嘛服務器

  11-14行:定義4個數據嘛,也就是瀏覽器地址的解析模式(等一下解釋)cookie

  17   行:這裏不是看到是否是感受到  咱們若是加一個php時候的文件的後綴

 

    20-49行:定義各類變量  可是下面的這段代碼  其中有一個函數  get_magic_quotes_gpc()  這個函數作什麼用  我大體查選了一下  大體說法  參考。TP裏面  能起到多大的做用  我也不是很清楚   若是誰知道  歡迎給你們說明一下

    PHP解析器就會自動爲post、get、cookie過來的數據增長轉義字符「\」,以確保這些數據不會引發程序,特別是數據庫語句由於特殊字符引發的污染而出現致命的錯誤。

1 if(version_compare(PHP_VERSION,'5.4.0','<')) {
2     ini_set('magic_quotes_runtime',0);
3     define('MAGIC_QUOTES_GPC',get_magic_quotes_gpc()? true : false);
4 }else{
5     define('MAGIC_QUOTES_GPC',false);
6 }

  最後是加載核心Think類  和運行Think類中的start()這個方法

1 // 加載核心Think類
2 require CORE_PATH.'Think'.EXT;
3 // 應用初始化 
4 Think\Think::start();

 

說明一下TP中的URL的幾個模式  資料

普通模式下 

 1 const URL_COMMON = 0; //普通模式 

   URL爲  http://localhost/?m=home&c=user&a=login&var=value

      m參數表示模塊,c參數表示控制器,a參數表示操做(固然這些參數都是能夠配置的),後面的表示其餘GET參數。

  'VAR_MODULE' => 'm', // 默認模塊獲取變量

  'VAR_CONTROLLER' => 'c', // 默認控制器獲取變量

    'VAR_ACTION' => 'a', // 默認操做獲取變量
  值的定義在ThinkPHP\Conf\Convention.php
  
 1     /* 系統變量名稱設置 */
 2     'VAR_MODULE'            =>  'm',     // 默認模塊獲取變量
 3     'VAR_ADDON'             =>  'addon',     // 默認的插件控制器命名空間變量
 4     'VAR_CONTROLLER'        =>  'c',    // 默認控制器獲取變量
 5     'VAR_ACTION'            =>  'a',    // 默認操做獲取變量
 6     'VAR_AJAX_SUBMIT'       =>  'ajax',  // 默認的AJAX提交變量
 7     'VAR_JSONP_HANDLER'     =>  'callback',
 8     'VAR_PATHINFO'          =>  's',    // 兼容模式PATHINFO獲取變量例如 ?s=/module/action/id/1 後面的參數取決於URL_PATHINFO_DEPR
 9     'VAR_TEMPLATE'          =>  't',    // 默認模板切換變量
10     'VAR_AUTO_STRING'        =>    false,    // 輸入變量是否自動強制轉換爲字符串 若是開啓則數組變量須要手動傳入變量修飾符獲取變量

 

PATHINFO模式

 1 const URL_PATHINFO = 1; //PATHINFO模式 該模式是默認模式

  URL: http://localhost/index.php/home/user/login/var/value/ 

  PATHINFO地址的前三個參數分別表示模塊/控制器/操做。

  說白了就是把普通模式下的幾個M  C  A 變量給省掉  使用斜槓來代替 

  好處:1.看上去很整齊   2.聽說能夠提升被搜索引擎抓住的概率哦!!!

  固然是斜槓仍是別的是能夠設置的在  ThinkPHP\Conf\Convention.php  文件中能夠進行設置

   1 'URL_PATHINFO_DEPR' => '/', // PATHINFO模式下,各參數之間的分割符號 

 

REWRITE模式

 1 const URL_REWRITE = 2; //REWRITE模式 

  官方的原話  : REWRITE模式是在PATHINFO模式的基礎上添加了重寫規則的支持,能夠去掉URL地址裏面的入口文件index.php,可是須要額外配置WEB服務器的重寫規則。

   如何是這樣,那麼我以爲應該就是  瀏覽器地址給重寫之後在按照PATHINFO模式進行解析路由

 

兼容模式

 1 const URL_COMPAT = 3; // 兼容模式

  URL http://localhost/?s=/home/user/login/var/value

  看到這個地址  YII的人有木有感受很熟悉

  爲何是S開頭呢?是由於配置文件的設置   在 ThinkPHP\Conf\Convention.php

   1 'VAR_PATHINFO' => 's', // 兼容模式PATHINFO獲取變量例如 ?s=/module/action/id/1 後面的參數取決於URL_PATHINFO_DEPR 

 

修改模式方法

  在配置文件 ThinkPHP\Conf\Convention.php

   1 'URL_MODEL' => 1, // URL訪問模式,可選參數0、一、二、3,表明如下四種模式: 2 // 0 (普通模式); 1 (PATHINFO 模式); 2 (REWRITE 模式); 3 (兼容模式) 默認爲PATHINFO 模式 

 

對於以上集中模式我的的小總結:  

  不論是那個  咱們把URL中出了模塊名稱開始前都去掉,就是不一樣的幾種取出模塊、控制器、控制器其中的方法名。因此在不配置路由和不使用默認的狀況下,咱們都能看到這三個參數。

 

總結:

  ThinkPHP\ThinkPHP.php文件中  最主要的目的仍是定義好各類目錄的變量方便之後的調用

  若是你發現代碼中有一個定義你不知道作什麼,若是是_path結尾(關於目錄的),就去ThinkPHP\ThinkPHP.php中找找,別的那麼就去ThinkPHP\Conf\Convention.php下找找  基本都能找到

 

幾個思考(我的在整理時候想到的):

  1.定義IS_CGI ,IS_WIN,IS_CLI,MAGIC_QUOTES_GPC幹嗎用

 1 // 系統信息
 2 if(version_compare(PHP_VERSION,'5.4.0','<')) {
 3     ini_set('magic_quotes_runtime',0);
 4     define('MAGIC_QUOTES_GPC',get_magic_quotes_gpc()? true : false);
 5 }else{
 6     define('MAGIC_QUOTES_GPC',false);
 7 }
 8 define('IS_CGI',(0 === strpos(PHP_SAPI,'cgi') || false !== strpos(PHP_SAPI,'fcgi')) ? 1 : 0 );
 9 define('IS_WIN',strstr(PHP_OS, 'WIN') ? 1 : 0 );
10 define('IS_CLI',PHP_SAPI=='cli'? 1   :   0);

  2.爲何咱們剛下載的架構不須要輸入模塊、控制器、方法名也能正常跳出頁面。

 

好了,下一次咱們就拿上小米加步槍殺進TP大門

 1 // 應用初始化 2 Think\Think::start(); 

相關文章
相關標籤/搜索