thinkphp执行流程

thinkphp执行流程
1. 入口文件index.php
用户对url的访问首先被定位到http:////index.php, 这里的入口文件index.php做三件事情:1.1 1.2 1.3
1.1 定义或载入全局变量
常见的有APP_NAME(项目名称) APP_PATH(项目路径) THINK_PATH(ThinkPHP框架路径);
我研究的是ThinkSNS1.6它除了用ThinkPHP的全局变量比如THINK_MODE 又加入了自己定义的一些全局变量,如SITE_PATH SITE_URL
注意到ThinkSNS定义了自己的模式ThinkSNS,


define('THINK_MODE''ThinkSNS');


关于ThinkPHP的模式扩展,在ThinkPHP2.0完全开发手册6.10模式扩展章节中有介绍,总的思想是通过模式扩展使得开发者可以定制自己需要使用的ThinkPHP底层框架核心不必拘泥于ThinkPHP默认的标准模式。

1.2 加载框架入口文件ThinkPHP.php
入口文件通常是ThinkPHP.php


require(THINK_PATH."/ThinkPHP.php");


而ThinkSNS定义了自己的入口文件ThinkSNS.php,不过总体的思想是一样的。
在这个框架入口文件,做下面的事情:

1.2.1 记录开始运行时间
$GLOBALS['_beginTime'] = microtime(TRUE);


1.2.2 检测THINK_PATH,APP_NAME APP_PATH
// ThinkPHP系统目录定义
if(!defined('THINK_PATH')) define('THINK_PATH' dirname(__FILE__));
if(!defined('APP_NAME')) define('APP_NAME' basename(dirname($_SERVER['script_FILENAME'])));
if(!defined('APP_PATH')) define('APP_PATH' dirname($_SERVER['script_FILENAME']));


1.2.3 检测项目编译缓存目录定义,没有则取项目的Temp目录
1.2.4 加载常量定义文件defines.php和公共函数文件functions.php
require THINK_PATH.'/Common/defines.php';

...

$runtime[] = THINK_PATH.'/Common/functions.php'; // 系统函数


1.2.5 加载核心基类
// 核心基类必须加载
$runtime[] = THINK_PATH.'/Lib/Think/Core/Think.class.php';


1.2.6 加载核心编译文件
核心编译文件列表由文件core.php给出;可以自定制,放在CONFIG_PATH下;或者可以根据扩展模式放在THINK_MODE下;或者使用默认的THINK_PATH.'/Common/core.php'
// 读取核心编译文件列表
if(is_file(CONFIG_PATH.'core.php')) {

// 加载项目自定义的核心编译文件列表
$list = include CONFIG_PATH.'core.php';
}else{
if(defined('THINK_MODE')) {
// 根据设置的运行模式加载不同的核心编译文件
$list = include

THINK_PATH.'/Mode/'.strtolower(THINK_MODE).'.php';
}else{
// 默认核心
$list = include THINK_PATH.'/Common/core.php';
}
}


默认的THINK_PATH.'/Common/core.php'的内容为

// 系统默认的核心列表文件
return array(
THINK_PATH.'/Lib/Think/Exception/ThinkException.class.php' // 异常处理类
THINK_PATH.'/Lib/Think/Core/Log.class.php' // 日志处理类
THINK_PATH.'/Lib/Think/Core/App.class.php' // 应用程序类
THINK_PATH.'/Lib/Think/Core/Action.class.php' // 控制器类
//THINK_PATH.'/Lib/Think/Core/Model.class.php' // 模型类
THINK_PATH.'/Lib/Think/Core/View.class.php' // 视图类
THINK_PATH.'/Common/alias.php' // 加载别名
);


这样就加载了系统核心类库(包括App、Action、Model、View、ThinkException、Log)
1.2.7 生成核心编译缓存~runtime.php
如果没有定义NO_CACHE_RUNTIME, 则把上面步骤中加载的文件统一写到~runtime.php中,下次就可以直接调用核心编译缓存~runtime.php,无需再一一加载


// 生成核心编译缓存 去掉文件空白以减少大小
if(!defined('NO_CACHE_RUNTIME')) {
$compile = defined('RUNTIME_ALLINONE');
$content = compile(THINK_PATH.'/Common/defines.php'$compile);
$content .= compile(defined('PATH_DEFINE_FILE')? PATH_DEFINE_FILE : THINK_PATH.'/Common/paths.php'$compile);
foreach ($runtime as $file){
$content .= compile($file$compile);
}
if(defined('STRIP_RUNTIME_SPACE') && STRIP_RUNTIME_SPACE == false ) {
file_put_contents(RUNTIME_PATH.'~runtime.php''

你可能感兴趣的:(thinkphp执行流程)