# 系统流程
[上一页](# "上一页")[下一页](# "下一页")
我们以访问网址 http://serverName.com/index.php/User/read/id/8 为例,分两种情况来解析下系统的执行流程,首先是调试模式下面的主要执行流程:
<table border="0" cellspacing="1" cellpadding="0"><tr><th>序号</th> <th>流程说明</th> </tr><tr><td>1</td> <td>用户访问网站URL地址</td> </tr><tr><td>2</td> <td>调用项目的入口文件(这里是index.php)</td> </tr><tr><td>3</td> <td>载入系统入口文件ThinkPHP.php</td> </tr><tr><td>4</td> <td>判断系统常量,如果没有定义则自动生成</td> </tr><tr><br/><td>5</td> <td>载入系统运行时文件runtime.php并定义项目路径常量</td> </tr><tr><td>6</td> <td>加载运行时所需的文件(通过调用load_runtime_file函数)</td> </tr><tr><td>7</td> <td>后面的流程和调试模式基本相同,只是模板编译过程省略了</td> </tr><tr><td>8</td> <td>读取核心基础文件列表和加载系统别名定义文件</td> </tr><tr><td>9</td> <td>检查项目相关目录是否存在,不存在则自动生成</td> </tr><tr><td>10</td> <td>调用Think::start执行入口</td> </tr><tr><td>11</td> <td>设置异常和错误处理机制</td> </tr><tr><td>12</td> <td>注册系统自动加载机制</td> </tr><tr><td>13</td> <td>预编译当前项目</td> </tr><tr><td>14</td> <td>加载框架惯例配置文件</td> </tr><tr><td>15</td> <td>读取当前的运行模式如果不是标准模式则加载模式的配置文件(如果存在)</td> </tr><tr><td>16</td> <td>加载模式和项目配置文件</td> </tr><tr><td>17</td> <td>加载框架底层语言包文件</td> </tr><tr><td>18</td> <td>加载当前模式的系统行为定义文件</td> </tr><tr><td>19</td> <td>加载当前模式的项目行为定义文件(如果存在)</td> </tr><tr><td>20</td> <td>读取核心编译文件列表</td> </tr><tr><td>21</td> <td>载入项目公共函数文件</td> </tr><tr><td>22</td> <td>加载模式和项目别名定义文件</td> </tr><tr><td>23</td> <td>加载系统调试模式配置文件</td> </tr><tr><td>24</td> <td>加载项目调试模式配置文件(如果存在)</td> </tr><tr><td>25</td> <td>执行当前模式的App::run();运行项目</td> </tr><tr><td>26</td> <td>如果定义了动态载入则载入动态项目配置文件和公共文件</td> </tr><tr><td>27</td> <td>URL调度,根据URL模式设置分析当前URL地址</td> </tr><tr><td>28</td> <td>URL路由检测</td> </tr><tr><td>29</td> <td>获取当前URL地址的分组、模块和操作名 及其他参数并生成URL相关常量定义</td> </tr><tr><td>30</td> <td>如果检测到分组,则加载分组的配置文件和公共文件</td> </tr><tr><td>31</td> <td>检测模板主题并生成模板系统常量</td> </tr><tr><td>32</td> <td>设置SESSION_ID 开启Session</td> </tr><tr><td>33</td> <td>根据分组和模块名,定位到控制器类并且实例化</td> </tr><tr><td>34</td> <td>检查并执行当前操作的前置方法</td> </tr><tr><td>35</td> <td>检查当前模块的_initialize方法</td> </tr><tr><td>36</td> <td>执行当前操作方法</td> </tr><tr><td>37</td> <td>调用控制器的Display方法输出</td> </tr><tr><td>38</td> <td>定位当前操作方法的模板文件</td> </tr><tr><td>39</td> <td>调用模板引擎解析模板内容并生成模板编译缓存文件</td> </tr><tr><td>40</td> <td>读取模板缓存文件进行变量输出,替换解析返回的内容中的需要替换的特殊字符串</td> </tr><tr><td>41</td> <td>生成表单令牌哈希</td> </tr><tr><td>42</td> <td>输出模板内容到浏览器</td> </tr><tr><td>43</td> <td>如果开启页面Trace显示则调用trace信息显示</td> </tr><tr><td>44</td> <td>检查并执行当前操作的后置方法</td> </tr><tr><td>45</td> <td>项目运行结束,记录内存中的日志信息到文件</td> </tr></table>
如果在部署模式下面(假设已经生成项目编译缓存),基本的系统流程是:
| 序号 | 流程说明 |
|-----|-----|
| 1 | 用户访问网站URL地址 |
| 2 | 调用项目的入口文件,如果替换了入口文件,则调用项目编译缓存文件,并跳过下面的3、4、5流程,直接执行后面的流程。 |
| 3 | 载入系统入口文件ThinkPHP.php |
| 4 | 判断系统常量,如果没有定义则自动生成 |
| 5 | 载入系统运行时文件runtime.php并定义项目路径常量 |
| 6 | 加载运行时所需的文件(通过调用load_runtime_file函数) |
| 7 | 加载系统基础函数库文件common.php |
系统执行流程根据不同的设置、行为和模式影响,可能存在差异,并不一定完整。但是开启页面Trace功能后,你就可以比较直观的看到当前的文件载入流程,能够帮助你了解系统的执行流程,例如新版的blog示例在关闭调试模式下面一共加载了20个文件,列表如下:`[0] => E:\www\App\Examples\Blog\index.php
[1] => E:\www\App\ThinkPHP\ThinkPHP.php
[2] => E:\www\App\Examples\Blog\Runtime\~runtime.php
[3] => E:\www\App\Examples\Blog\Lib\Behavior\CheckLangBehavior.class.php
[4] => E:\www\App\Examples\Blog\Lib\Action\BlogAction.class.php
[5] => E:\www\App\Examples\Blog\Lib\Action\PublicAction.class.php
[6] => E:\www\App\ThinkPHP\Lib\Core\Model.class.php
[7] => E:\www\App\ThinkPHP\Lib\Core\Db.class.php
[8] => E:\www\App\ThinkPHP\Lib\Driver\Db\DbMysql.class.php
[9] => E:\www\App\Examples\Blog\Runtime\Data\_fields\examples.Category.php
[10] => E:\www\App\Examples\Blog\Lib\Model\AdvModel.class.php
[11] => E:\www\App\Examples\Blog\Runtime\Data\_fields\examples.Blog.php
[12] => E:\www\App\Examples\Blog\Runtime\Data\_fields\examples.Comment.php
[13] => E:\www\App\Examples\Blog\Runtime\Data\_fields\examples.Tag.php
[14] => E:\www\App\Examples\Blog\Lib\Model\BlogViewModel.class.php
[15] => E:\www\App\Examples\Blog\Lib\Model\ViewModel.class.php
[16] => E:\www\App\Examples\Blog\Lib\Model\BlogModel.class.php
[17] => E:\www\App\Examples\Blog\Lib\Model\CategoryModel.class.php
[18] => E:\www\App\Examples\Blog\Lib\ORG\Page.class.php
[19] => E:\www\App\Examples\Blog\Runtime\Cache\2ab73b774a28fab5232b8c752b654018.php`
[上一页](# "上一页")[下一页](# "下一页")
- 序言
- 1. 入门
- 1.1 简介
- 1.2 基础概念
- 1.3 获取ThinkPHP
- 1.4 环境要求
- 1.5 许可协议
- 1.6 目录结构
- 1.7 命名规范
- 1.8 MVC分层
- 1.9 CBD架构
- 1.10 特性概述
- 1.11 系统流程
- 1.12 开发流程
- 2. 入口
- 2.1 入口文件
- 2.2 项目目录
- 2.3 部署目录
- 2.4 项目编译
- 2.5 调试模式
- 3. 配置
- 3.1 配置格式
- 3.2 惯例配置
- 3.3 项目配置
- 3.4 调试配置
- 3.5 分组配置
- 3.6 读取配置
- 3.7 动态配置
- 3.8 扩展配置
- 4. 函数和类库
- 4.1 函数库
- 4.2 类库
- 5. 控制器
- 5.1 URL模式
- 5.2 模块和操作
- 5.3 定义控制器
- 5.4 空操作
- 5.5 空模块
- 5.6 模块分组
- 5.7 URL伪静态
- 5.8 URL路由
- 5.9 URL重写
- 5.10 URL生成
- 5.11 URL大小写
- 5.12 前置和后置操作
- 5.13 跨模块调用
- 5.14 页面跳转
- 5.15 重定向
- 5.16 获取系统变量
- 5.17 判断请求类型
- 5.18 获取URL参数
- 5.19 AJAX返回
- 5.20 Action参数绑定
- 5.21 多层控制器支持
- 6. 模型
- 6.1 模型定义
- 6.2 模型实例化
- 6.3 字段定义
- 6.4 数据主键
- 6.5 属性访问
- 6.6 跨库操作
- 6.7 连接数据库
- 6.8 切换数据库
- 6.9 分布式数据库
- 6.10 创建数据
- 6.11 字段映射
- 6.12 连贯操作
- 6.13 CURD操作
- 6.14 ActiveRecord
- 6.15 自动验证
- 6.16 命名范围
- 6.17 自动完成
- 6.18 查询语言
- 6.19 查询锁定
- 6.20 字段排除
- 6.21 事务支持
- 6.22 高级模型
- 6.23 视图模型
- 6.24 关联模型
- 6.25 Mongo模型
- 6.26 动态模型
- 6.27 虚拟模型
- 6.28 多层模型支持
- 7. 视图
- 7.1 模板定义
- 7.2 模板赋值
- 7.3 模板输出
- 7.4 模板替换
- 7.5 获取内容
- 7.6 模板引擎
- 7.7 布局模板
- 8. 模板引擎
- 8.1 变量输出
- 8.2 系统变量
- 8.3 使用函数
- 8.4 默认值输出
- 8.5 使用运算符
- 8.6 内置标签
- 8.7 包含文件
- 8.8 导入文件
- 8.9 Volist标签
- 8.10 Foreach标签
- 8.11 For标签
- 8.12 Switch标签
- 8.13 比较标签
- 8.14 三元运算
- 8.15 范围判断标签
- 8.16 Present标签
- 8.17 Empty标签
- 8.18 Defined标签
- 8.19 Define标签
- 8.20 Assign标签
- 8.21 IF标签
- 8.22 标签嵌套
- 8.23 使用PHP代码
- 8.24 模板布局
- 8.25 模板继承
- 8.26 原样输出
- 8.27 模板注释
- 8.28 引入标签库
- 8.29 修改定界符
- 8.30 避免JS混淆
- 9. 日志
- 9.1 日志级别
- 9.2 记录方式
- 9.3 手动记录
- 10. 错误
- 10.1 异常处理
- 10.2 异常模板
- 10.3 异常显示
- 11. 调试
- 11.1 运行状态
- 11.2 页面Trace
- 11.3 调试方法
- 12. 缓存
- 12.1 缓存方式
- 12.2 动态缓存
- 12.3 缓存队列
- 12.4 快捷缓存
- 12.5 快速缓存
- 12.6 查询缓存
- 12.7 SQL解析缓存
- 12.8 静态缓存
- 13. 扩展
- 13.1 行为扩展
- 13.2 类库扩展
- 13.3 控制器扩展
- 13.4 模型扩展
- 13.5 驱动扩展
- 13.6 Widget扩展
- 13.7 模式扩展
- 13.8 引擎扩展
- 14. 安全
- 14.1 表单令牌
- 14.2 字段类型验证
- 14.3 防止SQL注入
- 14.4 输入过滤
- 14.5 上传安全
- 14.6 防止XSS攻击
- 14.7 其他安全建议
- 14.8 目录安全文件
- 14.9 保护模板文件
- 15. 性能
- 15.1 关闭调试模式
- 15.2 开启缓存
- 15.3 合并字段缓存
- 15.4 优化SQL
- 15.5 替换入口
- 15.6 前端优化
- 16. 部署
- 16.1 PATH_INFO支持
- 16.2 隐藏index.php
- 16.3 二级域名部署
- 16.4 定制错误页面
- 16.5 设置时区
- 17. SAE支持
- 17.1 SAE介绍
- 17.2 获取SAE
- 17.3 SAE开发
- 18. REST支持
- 18.1 REST介绍
- 18.2 REST模式
- 18.3 REST配置
- 18.4 REST路由
- 18.5 REST方法
- 19. 杂项
- 19.1 Session支持
- 19.2 Cookie支持
- 19.3 日期和时间
- 19.4 WML开发
- 19.5 多语言
- 19.6 数据分页
- 19.7 文件上传
- 19.8 验证码
- 19.9 图片添加水印
- 19.10 IP获取和定位
- 20. 附录
- 20.1 常量参考
- 20.2 配置参考
- 20.3 关于升级
- 20.4 大事记
- 鸣谢
- 关于