ThinkPHP3.2 加载过程(二)

原文:ThinkPHP3.2 加载过程(二)

回顾:

  上次介绍了 ThinkPHP 的 Index.PHP入口文件。但只是TP的入口前面的入口(刷boss总是要过好几关才能让你看到 ,不然boss都没面子啊),从Index.PHP最后一行把我们引路到了TP的大门前(ThinkPHP/ThinkPHP.php)

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

本次目标:

  查看TP的大门,同时稍微探索一下大门内部的东西

正文:

  先上代码

 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个数据嘛,也就是浏览器地址的解析模式(等一下解释)

  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、1、2、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();

时间: 2024-10-10 11:01:07

ThinkPHP3.2 加载过程(二)的相关文章

ThinkPHP3.2 加载过程(一)

原文:ThinkPHP3.2 加载过程(一) 加载过程(官方介绍) : 用户URL请求 调用应用入口文件(通常是网站的index.php) 载入框架入口文件(ThinkPHP.php) 记录初始运行时间和内存开销 系统常量判断及定义 载入框架引导类(Think\Think)并执行Think::start方法进行应用初始化 设置错误处理机制和自动加载机制 调用Think\Storage类进行存储初始化(由STORAGE_TYPE常量定义存储类型) 部署模式下如果存在应用编译缓存文件则直接加载(直接

ThinkPHP3.2 加载过程(四)

前言: 由于比较懒散,但是又是有点强迫症,所以还是想继续把ThinkPHP3.2的加载过程这个烂尾楼补充完整. ========================================分割线================================= 上次最后一个篇说道加载APP:run()   ----在ThinkPHP/Library/Think/Thinkclass.php下 在这里说明一下APP在什么时候会被定义并且加载的 配置文件ThinkPHP/Mode/common.

ThinkPHP3.2 加载过程(三)

上次回顾: IS_CGI ,IS_WIN,IS_CLI,MAGIC_QUOTES_GPC干嘛用 IS_WIN 看了一下后面的代码  基本上就是为了保证在不同环境下运行时,由于有些操作系统会对文件路径大小写敏感,定义该参数.对路径进行更严格的检查.  MAGIC_QUOTES_GPC  : 1 if(version_compare(PHP_VERSION,'5.4.0','<')) { 2 ini_set('magic_quotes_runtime',0); 3 define('MAGIC_QUO

spring容器启动的加载过程(二)

第六步: public abstract class AbstractApplicationContext extends DefaultResourceLoader implements ConfigurableApplicationContext, DisposableBean { protected ConfigurableListableBeanFactory obtainFreshBeanFactory() { refreshBeanFactory();//具体实现调用子类容器的ref

组策略系列之二:组策略的加载过程

http://jary3000.blog.51cto.com/610705/121770 上期我们学习了组策略的功能和管理工具,那么对于组策略来说,到底有几部分组成呢?域用户在客户端登录,组策略是如何加载的呢? 一.组策略对象的存储:(GPC+GPT)    我们通过GPMC.msc新建一个组策略后,其实是建了一个GPO(组策略对象),那我们平时所说的其实就是GPO.    那我们可以在哪些容器上链接GPO呢?我们只能在LSDOU这几个容器上链接GPO.即Local.Site.Domain.OU

JAVA-大白话探索JVM-类加载过程(二)

首先我们知道JVM是什么以及类加载器的作用 不清楚的可以看看JAVA-大白话探索JVM-类加载器(一) 现在我们来摸索下类的加载过程 首先,我们将类加载过程分为三步走 装载 链接 初始化 其中 链接 分为三步骤 1.装载 通过一个类的全限定名获取其定义的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口 2.链接 验证 确保Class文件的字节流信息符合JVM的要求 4个阶段校

Linux内核启动及文件系统加载过程

上接博文<u-boot之u-boot-2009.11启动过程分析> 当u-boot开始执行bootcmd命令,就进入Linux内核启动阶段,与u-boot类似,普通Linux内核的启动过程也可以分为两个阶段,但针对压缩了的内核如uImage就要包括内核自解压过程了.本文以项目中使用的linux-2.6.37版源码为例分三个阶段来描述内核启动全过程.第一阶段为内核自解压过程,第二阶段主要工作是设置ARM处理器工作模式.使能MMU.设置一级页表等,而第三阶段则主要为C代码,包括内核初始化的全部工作

DOM加载过程

静态的dom 动态的dom http://blog.csdn.net/cxiaokai/article/details/7552653 一:预编译   解释 js加载过程中,会先将变量和函数预编译 预编译期  变量赋值undefined 当JavaScript引擎解析脚本时,它会在预编译期对所有声明的变量和函数进行处理. 做如下处理: 1. 在执行前会进行类似"预编译"的操作:首先会创建一个当前执行环境下的 活动对象,并将那些用var申明的变量设置为活动对象的属性,但是此时这些变量的赋

class文件加载过程详解

java类的加载过程. 参考书籍:深入理解JAVA虚拟机 书中错误的地方,p222. 字段解析,在解析一个未解析过的字段时,书中说的是先解析字段表的class_index, 但是,字段表示没有class_index, 跟在字节码指令后边的字段的符号引用是CONSTANT_Field_info. 先对其中的class_index解析. 这个过程,比较复杂,要理解这个过程,你要对Class文件结构比较了解,尤其是字段表. 1.累加载的整体流程 加载--验证--准备--解析--初始化--使用--卸载