2019独角兽企业重金招聘Python工程师标准>>>

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

thinkphp执行流程相关推荐

  1. php面试框架的执行流程图,ThinkPHP2.2框架执行流程图,ThinkPHP控制器的执行流程

    ThinkPHP2.2框架执行原理.流程图在线手册 ThinkPHP控制器的执行流程 对用户的第一次URL访问http:///My/index.php/Index/show/所执行的流程进行详细的分析 ...

  2. 动态执行流程分析和性能瓶颈分析的利器——gperftools的Cpu Profiler

    在<动态执行流程分析和性能瓶颈分析的利器--valgrind的callgrind>中,我们领略了valgrind对流程和性能瓶颈分析的强大能力.本文将介绍拥有相似能力的gperftools ...

  3. 动态执行流程分析和性能瓶颈分析的利器——valgrind的callgrind

    在<内存.性能问题分析的利器--valgrind>一文中我们简单介绍了下valgrind工具集,本文将使用callgrind工具进行动态执行流程分析和性能瓶颈分析.(转载请指明出于brea ...

  4. 使用Caffe进行手写数字识别执行流程解析

    之前在 http://blog.csdn.net/fengbingchun/article/details/50987185 中仿照Caffe中的examples实现对手写数字进行识别,这里详细介绍下 ...

  5. Caffe中对MNIST执行train操作执行流程解析

    之前在 http://blog.csdn.net/fengbingchun/article/details/49849225 中简单介绍过使用Caffe train MNIST的文章,当时只是仿照ca ...

  6. pip包管理工具-install执行流程简单查看

    pip概述 pip是python提供的包管理工具,该工具提供了对python包的查找.下载.安装与卸载等功能的工具,当前是python中比较主流的管理工具. pip下载安装包的概述 pip工具的本质通 ...

  7. djangorestframework源码分析2:serializer序列化数据的执行流程

    djangorestframework源码分析 本文环境python3.5.2,djangorestframework (3.5.1)系列 djangorestframework源码分析-serial ...

  8. djangorestframework源码分析1:generics中的view执行流程

    djangorestframework源码分析 本文环境python3.5.2,djangorestframework (3.5.1)系列 djangorestframework源码分析-generi ...

  9. 一文搞懂select语句在MySQL中的执行流程!

    MySQL作为互联网行业使用最多的关系型数据库之一,与其免费.开源的特性是密不可分的.然而,很多小伙伴工作了很多年,只知道使用MySQL进行CRUD操作,这也导致很多小伙伴工作多年后,想跳槽进入大厂, ...

最新文章

  1. typescript 叹号_TypeScript系列(五)最佳实践
  2. JavaScript 爆红后,微软为何还要开发 TypeScript?
  3. scatter 基本用法 python matplotlib
  4. [创业经验] 白手起家的艺术
  5. 图神经网络(GNN)综述
  6. log4j不生成日志文件的问题
  7. 【操作系统】线程的实现-思维导图
  8. JAX 是 Google 开发的计算机视觉研究
  9. Spring入门之IOC
  10. 区分clientHeight、scrollHeight、offsetHeight
  11. Vivado synth 8-439 module““not found问题绝对解决,超简单,想解决问题就看这里。
  12. css3中-moz、-ms、-webkit各什么意思
  13. 说说 PWA 和微信小程序--Progressive Web App
  14. 川藏北线-成都老茶馆叹茶
  15. git 如何回退版本(通俗易懂,简单上手)
  16. elasticsearch geo DSL 和API对比学习-矩形/多边形/距离/距离排序/距离分段聚合/geo_shape内含-相交-相离
  17. mct接收_Android实现文件上传功能(接收端用strust2)
  18. 销售——LPN(License Plate Number)
  19. html查找器如何卸载,租号器要求卸载影子系统-怎么完全删除影子系统
  20. boss网人脸识别认证_央视名嘴、互联网巨头、BOSS联袂带货 星途LX 1.5T锁定715云上市...

热门文章

  1. CSR8670的A2DP与AVRCP的应用笔记
  2. [剑指offer] 用两个栈实现队列
  3. C++中的 Round(),floor(),ceil()
  4. Android -- Intent
  5. 软件工程实践第二次作业——个人项目实战(数独)
  6. ESXI上的vm虚拟机文件被锁定无法POWER ON的问题处理
  7. [转载]Emmet使用手册
  8. yii 操作cookie
  9. T4 (Text Template Transformation Toolkit)实现简单实体代码生成
  10. 最牛B隐藏文件(续)