thinkphp执行流程
1. 入口文件index.php用户对url的访问首先被定位到http:index.php, 这里的入口文件index.php做三件事情:1.1 1.2 1.31.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.phprequire(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.phprequire 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 = includeTHINK_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''