ThinkPHP3.0启动过程
以Blog举例
载入项目入口文件
D:\wamp\www\Examples\Blog\index.php
定义常量
APP_NAME,Blog
APP_PATH,D:\wamp\www\Examples\Blog\ (APP_PATH为项目核心框架结构文件(lib)所在目录)
载入ThinkPHP框架入口文件
D:\wamp\www\ThinkPHP\ThinkPHP.php
记录开始运行时间,记录内存使用情况
检查项目是否定义常量APP_PATH,(如果没有定义为目录D:\wamp\www\ThinkPHP\)
根据APP_PATH定义常量RUNTIME_PATH,D:\wamp\www\Examples\Blog\Runtime\
检查项目是否定义常量APP_DEBUG,false (如果没有定义为false)
检查项目是否定义常量MODE_NAME,~runtime.php (如果没有定义为~runtime.php)
定义常量RUNTIME_FILE,D:\wamp\www\Examples\Blog\Runtime\~runtime.php
如果非调试并存在RUNTIME_FILE,直接加载D:\wamp\www\Examples\Blog\Runtime\~runtime.php
如果现在还没有这个文件
定义常量THINK_PATH,D:\wamp\www\ThinkPHP\ThinkPHP\
加载运行时文件
D:\wamp\www\ThinkPHP\ThinkPHP\Common\runtime.php
检查是否定义常量THINK_PATH,没定义就终止程序
检查PHP版本,如果小于5.2.0终止程序执行
定义常量THINK_VERSION,3.0
定义常量THINK_RELEASE,20120323
根据PHP版本设置魔术引号
定义常量MAGIC_QUOTES_GPC,False
定义常量IS_CGI,0
定义常量IS_WIN,1
定义常量IS_CLI,0
检查是否定义APP_NAME
PHP非CLI模式下
定义常量_PHP_FILE_,/Examples/Blog/index.php
定义常量__ROOT__,/Examples
定义常量URL_COMMON, 0
定义常量URL_PATHINFO, 1
定义常量URL_REWRITE, 2
定义常量URL_COMPAT, 3
路径设置 可在项目或者THINKPHP入口文件中重新定义 所有路径常量都必须以/ 结尾
定义常量CORE_PATH, D:\wamp\www\ThinkPHP/Lib/
定义常量EXTEND_PATH, D:\wamp\www\ThinkPHP/Extend/
定义常量MODE_PATH, D:\wamp\www\ThinkPHP/Extend/Mode/
定义常量ENGINE_PATH, D:\wamp\www\ThinkPHP/Extend/Engine/
定义常量VENDOR_PATH, D:\wamp\www\ThinkPHP/Extend/Vendor/
定义常量LIBRARY_PATH,D:\wamp\www\ThinkPHP/Extend/Library/
定义常量COMMON_PATH, D:\wamp\www\Examples\Blog\Common/
定义常量LIB_PATH, D:\wamp\www\Examples\Blog\Lib/
定义常量CONF_PATH, D:\wamp\www\Examples\Blog\Conf/
定义常量LANG_PATH, D:\wamp\www\Examples\Blog\Lang/
定义常量TMPL_PATH, D:\wamp\www\Examples\Blog\Tpl/
定义常量HTML_PATH, D:\wamp\www\Examples\Blog\Html/
定义常量LOG_PATH, D:\wamp\www\Examples\Blog\Runtime/Logs/
定义常量TEMP_PATH, D:\wamp\www\Examples\Blog\Runtime/Temp/
定义常量DATA_PATH, D:\wamp\www\Examples\Blog\Runtime/Data/
定义常量CACHE_PATH, D:\wamp\www\Examples\Blog\Runtime/Cache/
设置VENDOR_PATH目录到include_path
定义初始化方法,build_app_dir,build_first_action,build_runtime_cache,build_tags_cache,check_runtime,load_runtime_file
调用load_runtime_file方法
加载基础函数文件common.php,D:\wamp\www\ThinkPHP\Common/common.php
加载核心编译文件
D:\wamp\www\ThinkPHP/Lib/Core/Think.class.php
D:\wamp\www\ThinkPHP/Lib/Core/ThinkException.class.php
D:\wamp\www\ThinkPHP/Lib/Core/Behavior.class.php
把别名配置文件导入别名静态变量$_alias,别名配置文件为D:\wamp\www\ThinkPHP\Conf/alias.php
如果目录D:\wamp\www\Examples\Blog\Lib/不存在,创建默认项目文件结构及config.php和IndexAction.class.php文件
如果存在就检查项目的缓存目录D:\wamp\www\Examples\Blog\Runtime/Cache/。不存在就创建默认文件结构。
如果是调试模式,删除RUNTIME_FILE定义的文件
记录加载文件时间
执行Think::Start()
该方法在核心文件D:\wamp\www\ThinkPHP/Lib/Core/Think.class.php类里
设定错误和异常处理,appError,appException
注册AUTOLOAD方法,autoload
执行Think::builApp方法
把惯例配置文件导入配置静态变量$_config,惯例配置文件为D:\wamp\www\ThinkPHP\Conf/convention.php
如果定义常量MODE_NAME,则到D:\wamp\www\ThinkPHP/Extend/Mode/目录下导入对应的模式配置文件到变量$mode
如果模式配置配置文件有config项,就导入到配置静态变量$_config
把项目配置配置文件D:\wamp\www\Examples\Blog\Conf/config.php导入配置静态变量$_config
加载顶层语言包D:\wamp\www\ThinkPHP\Lang\zh-cn.php到语言静态变量$_lang
系统行为定义如下:
如果静态配置变量中有APP_TAGS_ON,并且为true,加载变量$mode的extends项到配置静态变量$_config的extends下,变量$mode没有extends项,
把系统配置下的tags.php导入到配置静态变量$_config的extends下,D:\wamp\www\ThinkPHP\Conf/tags.php
项目行为定义如下:
加载变量$mode的extends项到配置静态变量$_config的tags下,变量$mode没有tags项,
把项目配置下的tags.php导入到配置静态变量$_config的tags下,D:\wamp\www\Examples\Blog\Conf/tags.php
读取核心编译文件如下:
如果变量$mode定义core,核心文件为该项,如果没有定义,核心文件则为
D:\wamp\www\ThinkPHP\Common/functions.php
D:\wamp\www\ThinkPHP/Lib/Core/Log.class.php
D:\wamp\www\ThinkPHP/Lib/Core/Dispatcher.class.php
D:\wamp\www\ThinkPHP/Lib/Core/App.class.php
D:\wamp\www\ThinkPHP/Lib/Core/Action.class.php
D:\wamp\www\ThinkPHP/Lib/Core/View.class.php
把项目核心配置定义D:\wamp\www\Examples\Blog\Conf/core.php的数组及以上文件保存到变量$list
依次加载核心文件
非调试模式时把这些核心文件写入变量$compile
加载项目公共文件D:\wamp\www\Examples\Blog\Common/common.php
非调试模式时把项目公共文件写入变量$compile
把变量$mode的alias项导入别名静态变量$_alias
非调试模式时把变量$mode的alias项写入变量$compile
把项目别名文件导入别名静态变量$_alias,D:\wamp\www\Examples\Blog\Conf/alias.php
非调试模式时把项目别名文件的alias项写入变量$compile
如果是调试环境,
把系统调试配置文件导入配置静态变量$_config,D:\wamp\www\ThinkPHP\ThinkPHP\Conf/debug.php
取出APP_STATUS配置,加载项目配置调试配置文件 D:\wamp\www\Examples\Blog\Conf/$status.php
如果非调试模式,调用build_runtime_cache函数生成编译文件
基本上将语言包,配置,别名,核心函数,defined变量,D:\wamp\www\ThinkPHP/Lib/Behavior/里的由extends定义的类,生成一个文件~runtime.php
执行APP::run方法
根据extends和tags记录的app_init项,实例化行为
设置时区
如果配置静态变量$_config有LOAD_EXT_FILE项,则动态在D:\wamp\www\Examples\Blog\Common/目录下加载文件
如果配置静态变量$_config有LOAD_EXT_CONFIG项,则动态在D:\wamp\www\Examples\Blog\Conf/目录下加载文件到静态变量$_config
执行Dispatcher::dispatch方法
这里代码太多~~~不好理解
如果定了分组,根据分组加载配置和函数
定义模板相关常量
根据extends和tags记录的app_begin项,实例化行为
根据配置静态变量$_config的SESSION_OPTIONS项session初始化
根据SESSION_TYPE到D:\wamp\www\ThinkPHP/Extend/Driver\Session/目录下加载对应的类并实例化,执行实例的execute方法
记录应用初始化时间
执行mvc流程,
涉及__hack_module方法和Empty模块
执行action_name行为
执行该模块对应动作的_before_action方法
执行模块对应动作
执行该模块对应动作的_after_action方法
根据extends和tags记录的app_end项,实例化行为
保存日志记录
附录:
自动加载
先从别名静态配置变量$_alias里查找,如果有直接加载
如果是Behavior类,从D:\wamp\www\ThinkPHP/Lib/Behavior/目录,D:\wamp\www\ThinkPHP/Extend/Behavior/目录,D:\wamp\www\Examples\Blog\Lib/Behavior/,模式目录的/Behavior/目录查找
如果是Model类,从D:\wamp\www\Examples\Blog\Lib/Model/目录,D:\wamp\www\ThinkPHP/Extend/Model/目录查找
如果是Action类,从D:\wamp\www\Examples\Blog\Lib/Action/目录,D:\wamp\www\ThinkPHP/Extend/Action/目录查找
根据配置静态变量$_config的APP_AUTOLAOD_PATH项自动加载
配置文件顺序
系统别名 alias.php
系统惯例 convention.php
系统模式配置文件 例如cli.php
项目配置文件 config.php
语言包文件 zh-cn.php
系统行为文件 tags.php
项目行为文件 tags.php
项目核心配置 core.php
项目别名 alias.php
系统调试配置文件 debug.php
项目调试配置,$status.php
ThinkPHP3.0启动过程的更多相关文章
- Android 6.0启动过程具体解析
在之前的一篇文章中.从概念上学习了Andoird系统的启动过程.Android系统启动过程学习 而在这篇文章中,我们将从代码角度细致学习Android系统的启动过程,同一时候,学习Android启动过 ...
- 【源码阅读】SpringBoot-v2.2.0启动过程以及细节
启动流程 图如下: 以上流程图源文件(可导入https://www.processon.com):https://github.com/Mysakura/DataFiles 相关Event(org.s ...
- Android深入四大组件(五)Android8.0 根Activity启动过程(后篇)
前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程(前篇)和Android深入四大组件(一)应用程序启动过程(后篇)这两篇文章,它们都是基于Android 7.0,当我开始阅读An ...
- Android深入四大组件(四)Android8.0 根Activity启动过程(前篇)
前言 在几个月前我写了Android深入四大组件(一)应用程序启动过程(前篇)和Android深入四大组件(一)应用程序启动过程(后篇)这两篇文章,它们都是基于Android 7.0,当我开始阅读An ...
- zookeeper源码分析之一服务端启动过程
zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...
- [原] KVM 虚拟化原理探究(2)— QEMU启动过程
KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...
- Openfire的启动过程与session管理
说明 本文源码基于Openfire4.0.2. Openfire的启动 Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openfire.jar包,并启动一个 ...
- 探索 Linux 系统的启动过程
引言 之所以想到写这些东西,那是因为我确实想让大家也和我一样,把 Linux 桌面系统打造成真真正正日常使用的工具,而不是安装之后试用几把再删掉.我是真的在日常生活和工作中都使用 Linux,比如在 ...
- Linux内核启动过程概述
版权声明:本文原创,转载需声明作者ID和原文链接地址. Hi!大家好,我是CrazyCatJack.今天给大家带来的是Linux内核启动过程概述.希望能够帮助大家更好的理解Linux内核的启动,并且创 ...
随机推荐
- Java深入 - 深入 Java自己定义注解
我们在使用Spring框架的时候,会常常使用类似:@Autowired 这种注解. 我们也能够自定义一些注解.Java的注解主要在包:java.lang.annotation中实现. 1. 元注解 什 ...
- SVN的管理方式和git的管理方式
SVN是集中式的管理方式.大致流程如下: 1.从服务器上将整个项目代码检出到本地电脑硬盘中(一般来说,是从主分支上下载的代码).2.然后在svn服务器中建立新的开发分支,将硬盘中的代码提交到该开发分支 ...
- lodash用法系列(2),处理对象
Lodash用来操作对象和集合,比Underscore拥有更多的功能和更好的性能. 官网:https://lodash.com/引用:<script src="//cdnjs.clou ...
- Javascript 中的arguments
arguments是当前正在执行的function的一个参数,它保存了函数当前调用的参数. 使用方法:function.arguments[i]. 其中function.是可选项,是当前正在执行的 ...
- Javascript原型继承原理
对于面向对象的基础语法在此我就不重复了,对面向对象不熟悉的朋友可以参看<使用面向对象的技术创建高级 Web 应用程序>一文. prototype与[[prototype]] 在有面象对象基 ...
- UITabBar 详解
1.push时,将tabar隐藏,方法1,在push之前,加入如下代码: -(IBAction)btnOnClicked:(id)sender { SQVideoListViewController ...
- iOS用全局宏的概念理解xcode中的设置 preprocessor macros
ios有没有全局宏,或者在工程属性里设置宏? 比如我设置了一个宏叫IOS, 在所有/整个工程的代码里这个宏都是有效的. ------解决方案-------------------- 在工程的设置属性里 ...
- EXCEL密码破解/破解工作表保护密码
网上有很多这个代码,但很多朋友并不太了解如何运用在此做了一些整理,希望对大家有所帮助! 注:很多时候会因为忘记密码丢失重要EXCEL文件而烦恼,这份代码就能帮你找回,仅仅出之这个初衷,如因为这个代码让 ...
- Java 公历转农历,然后农历减一年(或者几天或者任意天),再把这个日期转成公历
由于系统的提醒有可能是农历的今天或指定时间要用quartz 实现定时任务 公历转农历,然后农历减一年(或者几天或者任意天),再把这个日期转成公历. 网上很多农历转公历的程序都有问题,QQ.百度的也有 ...
- ExtJS 教程目录
今天我创建了一个小组,取名ExtJS互助团,欢迎朋友们加入!遇到问题需要帮助的时候别忘了ExtJS互助团!希望更多的园友加入进来,帮别人,也是帮自己!组内讨论不限于ExtJS,还包括FineUI.Ex ...