博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
thinkphp执行流程
阅读量:6325 次
发布时间:2019-06-22

本文共 2726 字,大约阅读时间需要 9 分钟。

hot3.png

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''

转载于:https://my.oschina.net/604388847/blog/219810

你可能感兴趣的文章
[BLE--Link Layer]设备蓝牙地址
查看>>
ZooKeeper分布式集群部署及问题
查看>>
泛型 Generic
查看>>
第二篇工作总结之我的测试学习之路
查看>>
对象:封装,继承,多态
查看>>
Linux命令的类型
查看>>
开天辟地第一篇
查看>>
SkShader
查看>>
C++ 11保留小数点的四舍五入方案
查看>>
路径,通过navigation可以查看 *.class文件
查看>>
操作系统课程设计:用多线程同步方法解决读者阅览问题
查看>>
杂文 | 一些无用但有趣事情(持续更新中...)
查看>>
delphi 获取webbrowser的cookies给Idhttp用
查看>>
华为鸿蒙系统再公测,华为鸿蒙系统开启第二轮公测,新增七款机型!
查看>>
华为荣耀老机型鸿蒙,曝荣耀手机计划升级鸿蒙:共5款老机型 有你的吗?
查看>>
android手机 电话报名,国产第一个手机品牌开启Android 12尝鲜,你报名了吗?
查看>>
android按钮实例化,android按钮点击——implements View.OnClickListener
查看>>
android studio程序打不开,Android Studio project 文件打不开问题解决
查看>>
android 非匿名事件,MainActivity报错如何解决,是独立类和接口类监听事件报错,匿名内部类和外部类实现监听事件没错。...
查看>>
signature=cc29255b4425ca4c96b4511e5937abfa,http
查看>>