0

0

tp流程

php中文网

php中文网

发布时间:2016-06-07 11:44:00

|

1761人浏览过

|

来源于php中文网

原创

tp的流程代码 很多 慢慢看
tp已经用了很久了。可是使用起来是很顺利。可是源码已经运行流程都不了解。今天了解下thinkphp的运行流程。


首先是框架的目录

/index.php //项目入口文件

/ThinkPHP/ThinkPHP.php //框架入口文件

Common 框架公共文件目录(函数库)

ThinkPHP/Common/runtime.php //框架初次运行文件

ThinkPHP/Common/common.php //框架基础函数库

ThinkPHP/Common/functions.php //标准模式公共函数库

Conf 框架配置文件目录

ThinkPHP/Conf/convention.php //惯例配置文件,系统默认配置小于项目配置

ThinkPHP/Conf/debug.php //默认的调试模式配置文件

Lang 框架系统语言目录

Lib 系统核心基类库目录

ThinkPHP/Core/Think.class.php //入口文件(设置异常和错误处理机制、注册系统自动加载机制、预编译当前项目、加载框架惯例配置文件)

ThinkPHP/Lib/Core/Log.class.php, // 日志处理类

ThinkPHP/Lib/Core/Dispatcher.class.php, // URL调度类

ThinkPHP/Lib/Core/App.class.php, // 应用程序类

ThinkPHP/Lib/Core/Action.class.php, // 控制器类

ThinkPHP/Lib/Core/View.class.php, // 视图类

Tpl 系统模板目录

ThinkPHP/Tpl/default_index.tpl //测试模块的模板

ThinkPHP/Tpl/dispatch_jump.tpl //页面提示的模板

ThinkPHP/Tpl/page_trace.tpl //页面Trace信息的模板

ThinkPHP/Tpl/think_exception.tpl //系统错误信息的模板

Extend 框架扩展目录







/*

* 1、用户访问网站URL地址

* /Index.php 项目入口文件

*/

require ('../ThinkPHP/ThinkPHP.php');//引入框架文件



/*

* 2、载入系统入口文件ThinkPHP.php

* ThinkPHP/ThinkPHP.php框架入口文件

* 判断系统常量,如果没有定义则自动生成

*/

$GLOBALS['_beginTime'] = microtime(TRUE); //记录运行时的时间


define('MEMORY_LIMIT_ON',function_exists('memory_get_usage'));//php中用echo memory_get_usage() 获取当前的内存消耗量


if(MEMORY_LIMIT_ON) $GLOBALS['_startUseMems'] = memory_get_usage();//如果支持内存使用量函数则全局变量$GLOBALS['_startUseMems']等于内存使用量,这里相当于记录下内存初始使用的量


defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']).'/');//设置当前的项目路径


defined('RUNTIME_PATH') or define('RUNTIME_PATH',APP_PATH.'Runtime/');//设置runtime的路径


defined('APP_DEBUG') or define('APP_DEBUG',false); // 是否调试模式,默认false


$runtime = defined('MODE_NAME')?'~'.strtolower(MODE_NAME).'_runtime.php':'~runtime.php';//如果设置了其它运行模式则~ruturn.php就变化为 ~模式ruturn.php,(例如,采用命令行模式运行),那么在入口文件中定义MODE_NAME如下define('MODE_NAME','cli'); 那么这里的缓存文件就为~cliruturn.php


defined('RUNTIME_FILE') or define('RUNTIME_FILE',RUNTIME_PATH.$runtime);//设置~runtime.php的路径;


if(!APP_DEBUG && is_file(RUNTIME_FILE)) {

// 部署模式直接载入运行缓存

require RUNTIME_FILE;

}else{//高度模式下加载框架下的Common/runtime.php文件;我们就模拟程序第一次运行,从下面开始进入

// 系统目录定义

defined('THINK_PATH') or define('THINK_PATH', dirname(__FILE__).'/');

// 加载运行时文件,载入系统运行时文件runtime.php并定义项目路径常量

require THINK_PATH.'Common/runtime.php';

}



/*

* 3、载入系统运行时文件runtime.php并定义项目路径常量

* ThinkPHP/Common/runtime.php 系统运行时文件

* ThinkPHP 运行时文件 编译后不再加

*/


//从18——81行定义了程序中要用到的各种常量


//#84行 为了方便导入第三方类库 设置Vendor目录到include_path

set_include_path(get_include_path() . PATH_SEPARATOR . VENDOR_PATH);//这一句将/ThinkPHP/Extend/Vendor/ 加入了include_path目录中


//#87-114行 加载运行时所需要的文件 并负责自动目录生成

function load_runtime_file() {

//引入/ThinkPHP/Lib/Core/Think.class.php

//引入/ThinkPHP/Lib/Core/ThinkException.class.php, // 异常处理类

//引入/ThinkPHP/Lib/Core/Behavior.class.php,

// 检查项目目录结构 如果不存在则自动创建 build_app_dir();check_runtime();


}


//#118-130行 // 检查缓存目录(Runtime) 如果不存在则自动创建

function check_runtime() {

// 在load_runtime_file()中被引用

}


//#133-163行 //创建编译缓存

function build_runtime_cache($append='') {

//没仔细研究,是把程序中用到的代码都压入到~return.php缓存文件中

}


//#164-174 //// 编译系统行为扩展类库

function build_tags_cache() {

//编译系统行为扩展类库 compile($filename)此函数

}


//117-224 // 创建项目目录结构

function build_app_dir(){

//创建项目目录结构

}


//227-230 // 创建测试Action

function build_first_action(){

// /ThinkPHP/Tpl/default_index.tpl模板

}


//#233 加载运行时所需文件

load_runtime_file();


//#235 记录加载文件时间

G('loadTime');


// 执行入口

Think::Start();


/*

* 执行入口

* /ThinkPHP/Lib/Core/Think.class.php

* 程序的入口(设置异常和错误处理机制、注册系统自动加载机制、预编译当前项目、加载框架惯例配置文件)

*/


//#37-49 应用程序初始化

static public function Start() {

// 设定错误和异常处理

set_error_handler(array('Think','appError')); //将this->appError()注册为错误处理方法

set_exception_handler(array('Think','appException')); //将$this->appException()注册为异常处理函数

// 注册AUTOLOAD方法

spl_autoload_register(array('Think', 'autoload'));//将$this->autoload()注册为__autoload()方法

//[RUNTIME]

Think::buildApp(); // 读取配置信息 预编译项目

//[/RUNTIME]

// 运行应用

App::run();

return ;

}


//#61-124124 读取配置信息 预编译项目

static private function buildApp() {

// /ThinkPHP/Conf/convention.php 读取系统配置,读取项目配置 /项目/Conf/conf.php 合并配置

//加载语言包(可能是支持多语言的,目前没用到过)

//加载模式系统行为定义(没看明白)

//读取核心编译文件列表 (使用compile()函数,将所有核心类及函数、自定义类库压入到$compile变量中,等待编译~runtime.php)

(

ThinkPHP/Common/functions.php, // 标准模式函数库

ThinkPHP/Lib/Core/Log.class.php, // 日志处理类

ThinkPHP/Lib/Core/Dispatcher.class.php, // URL调度类

ThinkPHP/Lib/Core/App.class.php, // 应用程序类

ThinkPHP/Lib/Core/Action.class.php, // 控制器类

ThinkPHP/Lib/Core/View.class.php, // 视图类

);

// ThinkPHP/Common/common.php //加载项目公共文件(函数库)

// 项目/Conf/alias.php 加载项目别名定义(项目自定义类库,用别名导入的方式引入的自定义类库)

// 如果是调试模式,加载系统默认的配置文件ThinkPHP/Conf/debug.php的默认调试配置,如果项目自己定义了 项目/Conf/debug.php则读取项目调试配置

// 最后如果是部署模式 使用build_runtime_cache($compile); 创建编译缓存,将$compile变量写入到项目/Runtime/~runtime.php文件中

// 欧克至此该引入的文件全部引入完成,下面讲解控制器篇

// 最后的最后我们来回顾一下我们加载了些什么东西到程序中来

/*

* 1、ThinkPHP/Common/functions.php, // 标准模式函数库

* 2、ThinkPHP/Lib/Core/Log.class.php, // 日志处理类

* 3、ThinkPHP/Lib/Core/Dispatcher.class.php, // URL调度类

* 4、ThinkPHP/Lib/Core/App.class.php, // 应用程序类

* 5、ThinkPHP/Lib/Core/Action.class.php, // 控制器类

* 6、ThinkPHP/Lib/Core/View.class.php, // 视图类

* 7、ThinkPHP/Common/common.php //加载项目公共文件(函数库)

* 8、项目/Conf/alias.php 加载项目别名定义(项目自定义类库,用别名导入的方式引入的自定义类库)

* 9、ThinkPHP/Conf/debug.php的默认调试配置

*/

}


/*

* 加载了半天文件再在来真的了,正式进入程序运行 App::run();

* /ThinkPHP/lib/Core/App.class.php //应用程序类 执行应用过程管理

* 这里是整个程序的入口,我们要跳着读,首先跳入App::init();

* 最后一步跳入App::exec();

*/


// #148-164 运行应用实例 入口文件使用的快捷方法


static public function run() {

// 项目初始化标签

tag('app_init');

App::init();

// 项目开始标签

tag('app_begin');

// Session初始化

session(C('SESSION_OPTIONS'));

G('initTime');

//执行应用程序

App::exec();

// 项目结束标签

tag('app_end');

// 保存日志记录

if(C('LOG_RECORD')) Log::save();

return ;

}


// #36-76 应用程序初始化

static public function init() {

// load_ext_file(); 加载动态项目公共文件和配置

// URL调度 Dispatcher::dispatch(); //进入Thinkphp/lib/Core/Dispatcher.class.php dispatch()方法,进行URL参数常量赋值

// 如果有分组,include 分组配置与函数文件

// 获取模板主题名称 $templateSet = C('DEFAULT_THEME');

// 定义模板路径常量 define('THEME_PATH', TMPL_PATH.$group.(THEME_NAME?THEME_NAME.'/':''));

// 定义模板路径常量 define('APP_TMPL_PATH',.'/'.APP_NAME.(APP_NAME?'/':'').basename(TMPL_PATH).'/'.$group.(THEME_NAME?THEME_NAME.'/':''));

// 定义模板文件的位置 C('TEMPLATE_NAME',THEME_PATH.MODULE_NAME.(defined('GROUP_NAME')?C('TMPL_FILE_DEPR'):'/').ACTION_NAME.C('TMPL_TEMPLATE_SUFFIX'));

// 定义模板文件缓存的位置 C('CACHE_PATH',CACHE_PATH.$group);

}


// #89-138 执行应用程序

static public function exec() {

// 安全检测,模块名必须是英文和数字组成,且英文为首

// 检测通过 实例化 控制器 $module = A($group.MODULE_NAME);

// 检测如果定义了__hack_module()扩展,则遇到当前模块不存在时会被接管,优先级大于空模块EmptyAction

// 检测如果否定义空模块EmptyAction,则遇到不存在模块时调用EmptyAction模块

// 检测前置后置方法(_before_、_after_) method_exists($module,'_before_'.$action),如果有则执行 call_user_func(array(&$module,'_before_'.$action));

// 亮点在这里,至此URL解析完成了,跳转到 某某模块下的某某方法 执行当前操作 call_user_func(array(&$module,$action));

}





/*

* 接上一步,跳入App::init();后,我们发现需要跳入Dispatcher::dispatch();URL调度类中进行URL参数常量赋值,下面带你进入Disppatcher::dispatch方法中进行常量赋值

* ThinkPHP内置的Dispatcher类 只提供了一个公共的静态方法dispatch()方法作为接口,本方法将路由变量压入到常量中,供后面的action类使用

* 完成URL解析、路由和调度

* ThinkPHP/lib/Core/Dispatcher.class.php

* 完成后跳回到App::init();

*/


//#36-153 URL映射到控制器

static public function dispatch() {

//C('URL_MODEL');读取URL模式

//将模块提取到MODULE_NAME全局变量中,将动作提取到ACTION_NAME全局变量中,将参数

// $paths = explode($depr,trim($_SERVER['PATH_INFO'],'/'));//解析path_info

//$var[C('VAR_MODULE')] = array_shift($paths);//提取模块

// $var[C('VAR_ACTION')] = array_shift($paths);//提取方法

// $_GET = array_merge($var,$_GET);//重写$_GET

// pathinfo常量 /article/220

// 控制器常量 define('MODULE_NAME',self::getModule(C('VAR_MODULE')));

// 方法常量 define('ACTION_NAME',self::getAction(C('VAR_ACTION')));

// URL常量 define('/index.php/article/220.html',strip_tags($_SERVER['REQUEST_URI']));

// 当前项目地址常量 define('',strip_tags(PHP_FILE));

// 当前操作地址常量 define('/index/show_article',/index.$depr.ACTION_NAME);

// $_REQUEST = array_merge($_POST,$_GET); $_REQUEST重写

}

AD:真正免费,域名+虚机+企业邮箱=0元

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
ip地址修改教程大全
ip地址修改教程大全

本专题整合了ip地址修改教程大全,阅读下面的文章自行寻找合适的解决教程。

33

2025.12.26

压缩文件加密教程汇总
压缩文件加密教程汇总

本专题整合了压缩文件加密教程,阅读专题下面的文章了解更多详细教程。

18

2025.12.26

wifi无ip分配
wifi无ip分配

本专题整合了wifi无ip分配相关教程,阅读专题下面的文章了解更多详细教程。

46

2025.12.26

漫蛙漫画入口网址
漫蛙漫画入口网址

本专题整合了漫蛙入口网址大全,阅读下面的文章领取更多入口。

91

2025.12.26

b站看视频入口合集
b站看视频入口合集

本专题整合了b站哔哩哔哩相关入口合集,阅读下面的文章查看更多入口。

283

2025.12.26

俄罗斯搜索引擎yandex入口汇总
俄罗斯搜索引擎yandex入口汇总

本专题整合了俄罗斯搜索引擎yandex相关入口合集,阅读下面的文章查看更多入口。

370

2025.12.26

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

35

2025.12.25

错误代码dns_probe_possible
错误代码dns_probe_possible

本专题整合了电脑无法打开网页显示错误代码dns_probe_possible解决方法,阅读专题下面的文章了解更多处理方案。

25

2025.12.25

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

72

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 2.2万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.1万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号