项目初始化Init
项目预编译
URL剖析Dispather
获取模块和操作名
项目实行exec
实行掌握器的操作
调用模块获取数据
输出视图
入口文件的定义
<?php
define('THINK_PATH', '../ThinkPHP');
//定义项目名称,如果不定义,默认为入口文件名称
define('APP_NAME', 'web');
define('APP_PATH', './web');
//加载ThinkPHP框架公共入口文件
require(THINK_PATH.'/ThinkPHP.php');
//实例化一个网站运用实例
$App = new App();
//实行运用程序
$App->run();
?>
ThinkPHP.php里面的干了些啥记录开始实行韶光 $GLOBALS[‘_beginTime’](19行)
检测 THINK_PATH、 APP_NAME、 APP_PATH、 RUNTIME_PATH 定义,如果没有则创建(20-26行)
//不知道你创造没有,以index.php这基准,通过APP_PATH,可以组装出任意路径
检讨开启ALLINONE模式 (22行)
把核心编译缓存和项目编译缓存合并到一个文件里面去,并且过滤掉一些运行模式不须要实行的代码,并且对付用户的自定义常量全部统一定义,不再进行额外的检测。
检讨是否有核心缓存~runtime.php(33行)
if(file_exists(RUNTIME_PATH.'~runtime.php')) {
// 加载框架核心缓存文件
require RUNTIME_PATH.'~runtime.php';
}else{
//1.加载define.php和functions.php
//2.如果项目编译缓存目录不存在,则自动创建项目目录构造
//3.加载系统核心类库(包括ThinkPHP\LIB\THINK下级各子目录下的 Base、App、Action、Model、View、ThinkException、Log)
//4.如果 PHP 版本低于 5.2.0 则加载兼容函数库
//天生核心编译~runtime缓存
}
记录加载文件韶光 $GLOBALS['_loadTime'];
进入ThinkPHP\Lib\Think\Core\App入口文件中调用的$App->run()
public function run() {
$this->init();
$this->exec();
return ;
}
$App->run()返回的时候,对一个要求的处理就算完成了
App.class.php的init函数(1)1.设定缺点和非常处理机制(39-40行)
(set_error_handler和set_exception_handler)
2.项目预编译并载入(44-52行)
// 在支配模式下会自动在第一次实行的时候编译项目
if(defined('RUNTIME_MODEL')){
// 运行模式无需载入项目编译缓存
}elseif(is_file(RUNTIME_PATH.'~app.php') && (!is_file(CONFIG_PATH.'config.php') || filemtime(RUNTIME_PATH.'~app.php')>filemtime(CONFIG_PATH.'config.php'))) {
// 直接读取编译后的项目文件
C(include RUNTIME_PATH.'~app.php');
}else{
// 预编译项目
App::build();
}
3.设置时区支持(59-60行)
4.许可注册AUTOLOAD方法、 session初始化(62-66行)
5. URL剖析和调度(71行)
实行Dispatcher类的静态方法 dispatch() 。这段代码很不错。
6.加载项目分组公共文件(82-90行)
if(!defined('GROUP_NAME')) define('GROUP_NAME', App::getGroup());
7.取得模块和操作名称(92-93行)
if(!defined('MODULE_NAME')) define('MODULE_NAME', App::getModule());
if(!defined('ACTION_NAME')) define('ACTION_NAME', App::getAction());
8.加载模块配置文件(95-97行)
9.系统检讨(99-104行)
App::checkLanguage(); //措辞检讨
App::checkTemplate(); //模板检讨
if(C('HTML_CACHE_ON')) // 开启静态缓存
10.项目初始化标签
初始化完成,init返回
App.class.php的getGroupApp.class.php 228行
1. 检讨 VAR_MODULE 变量(231行)
(包括 GET 和 POST), 如果未定义,则获取默认分组名
分组名称解析完毕,也便是http://server/project/index.php/Model/Action/的project部分,回到init
App.class.php 186行
1. 检讨 VAR_MODULE 变量(189行)
(包括 GET 和 POST), 如果未定义,则获取默认模块名
2. 判断URL地址是否区分大小写
不区分,小写模块名
智能识别办法 index.php/user_type/index/ 识别到 UserTypeAction 模块
模块名称解析完毕,也便是http://server/project/index.php/Model/Action/的Model部分,回到init
App.class.php 209行
1. 检讨 VAR_MODULE 变量(211行)
(包括 GET 和 POST), 如果未定义,则获取默认模块名
操作名称解析完毕,也便是http://server/project/index.php/Model/Action/的Action部分,回到init
App.class.php的exec函数(1)1.创建Action掌握器实例(379行)
A()函数
2.获取当前操作名(400行)
$action = ACTION_NAME;
3.实行操作(401-418行)
// 实行操作链 最多只能有一个输出
1.实行前置操作 '_before_'.$action
2.实行当前操作 $action
3.实行后缀操作 '_after_'.$action
exec实行完毕,一个要求处理完成了
小结Thinkphp一次网页要求,便是实例化一个网站运用实例 ,并实行运用程序的过程。实行过程$App->run()分为init和exec两部分。
这中间还省略了一部分剖析,比如RBAC,比如Model干系的代码,VIEW操作解析等,将不才次分享中谈论。