文档介绍:流程大纲
加载公共入口文件
项目初始化Init
项目预编译
URL分析Dispather
获取模块和操作名
项目执行exec
执行控制器的操作
调用模块获取数据
输出视图
入口文件的定义
<?php
define('THINK_PATH', '../ThinkPHP');
//定义项目名称,如果不定义,默认为入口文件名称
define('APP_NAME', 'web');
define('APP_PATH', './web');
//加载ThinkPHP框架公共入口文件
require(THINK_PATH.'/');
//实例化一个网站应用实例
$App = new App();
//执行应用程序
$App->run();
?>
记录开始执行时间$GLOBALS[‘_beginTime’](19行)
检测 THINK_PATH、 APP_NAME、 APP_PATH、 RUNTIME_PATH 定义,如果没有则创建(20-26行)
//不知道你发现没有,,通过APP_PATH,可以组装出任意路径
检查开启ALLINONE模式(22行)
把核心编译缓存和项目编译缓存合并到一个文件里面去,并且过滤掉一些运行模式不需要执行的代码,并且对于用户的自定义常量全部统一定义,不再进行额外的检测。
检查是否有核心缓存~(33行)
if(file_exists(RUNTIME_PATH.'~')) {
// 加载框架核心缓存文件
require RUNTIME_PATH.'~';
}else{
//
//,则自动创建项目目录结构
//(包括ThinkPHP\LIB\THINK下级各子目录下的 Base、App、Action、Model、View、ThinkException、Log)
// PHP 版本低于 则加载兼容函数库
//生成核心编译~runtime缓存
}
记录加载文件时间$GLOBALS['_loadTime'];
进入ThinkPHP\Lib\Think\Core\App
入口文件中调用的$App->run()
public function run() {
$this->init();
$this->exec();
return ;
}
$App->run()返回的时候,对一个请求的处理就算完成了
(1)
(39-40行)
(set_error_handler和set_exception_handler)
(44-52行)
// 在部署模式下会自动在第一次执行的时候编译项目
if(defined('RUNTIME_MODEL')){
// 运行模式无需载入项目编译缓存
}elseif(is_file(RUNTIME_PATH.'~') && (!is_file(CONFIG_PATH.'') || filemtime(RUNTIME_PATH.'~')>filemtime(CONFIG_PATH.''))) {
// 直接读取编译后的项目文件
C(include RUNTIME_PATH.'~');
}else{
// 预编译项目
App::build();
}
(59-60行)
、 session初始化(62-66行)
(2)
5. URL分析和调度(71行)
执行Dispatcher类的静态方法 dispatch() 。这段代码很不错。
(82-90行)
if(!defined('GROUP_NAME')) define('GROUP_NAME', App::getGroup());
(92-93行)
if(!defined('MODULE_NAME')) define('MODULE_NAME', App::getModule());
if(!defined('ACTION_NAME')) define('ACTION_NAME', App::getAction());
(95-97行)
(99-104行)
App::c