# 系统流程
[上一页](11.html "上一页")[下一页](13.html "下一页")
我们以访问网址 http://serverName.com/index.php/User/read/id/8 为例,分两种情况来解析下系统的执行流程,首先是调试模式下面的主要执行流程:序号 流程说明 1 用户访问网站URL地址 2 调用项目的入口文件(这里是index.php) 3 载入系统入口文件ThinkPHP.php 4 判断系统常量,如果没有定义则自动生成 5 载入系统运行时文件runtime.php并定义项目路径常量 6 加载运行时所需的文件(通过调用load\_runtime\_file函数) 7 后面的流程和调试模式基本相同,只是模板编译过程省略了 8 读取核心基础文件列表和加载系统别名定义文件 9 检查项目相关目录是否存在,不存在则自动生成 10 调用Think::start执行入口 11 设置异常和错误处理机制 12 注册系统自动加载机制 13 预编译当前项目 14 加载框架惯例配置文件 15 读取当前的运行模式如果不是标准模式则加载模式的配置文件(如果存在) 16 加载模式和项目配置文件 17 加载框架底层语言包文件 18 加载当前模式的系统行为定义文件 19 加载当前模式的项目行为定义文件(如果存在) 20 读取核心编译文件列表 21 载入项目公共函数文件 22 加载模式和项目别名定义文件 23 加载系统调试模式配置文件 24 加载项目调试模式配置文件(如果存在) 25 执行当前模式的App::run();运行项目 26 如果定义了动态载入则载入动态项目配置文件和公共文件 27 URL调度,根据URL模式设置分析当前URL地址 28 URL路由检测 29 获取当前URL地址的分组、模块和操作名 及其他参数并生成URL相关常量定义 30 如果检测到分组,则加载分组的配置文件和公共文件 31 检测模板主题并生成模板系统常量 32 设置SESSION\_ID 开启Session 33 根据分组和模块名,定位到控制器类并且实例化 34 检查并执行当前操作的前置方法 35 检查当前模块的\_initialize方法 36 执行当前操作方法 37 调用控制器的Display方法输出 38 定位当前操作方法的模板文件 39 调用模板引擎解析模板内容并生成模板编译缓存文件 40 读取模板缓存文件进行变量输出,替换解析返回的内容中的需要替换的特殊字符串 41 生成表单令牌哈希 42 输出模板内容到浏览器 43 如果开启页面Trace显示则调用trace信息显示 44 检查并执行当前操作的后置方法 45 项目运行结束,记录内存中的日志信息到文件 如果在部署模式下面(假设已经生成项目编译缓存),基本的系统流程是:序号 流程说明 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<br class="calibre5"></br>[1] => E:\www\App\ThinkPHP\ThinkPHP.php<br class="calibre5"></br>[2] => E:\www\App\Examples\Blog\Runtime\~runtime.php<br class="calibre5"></br>[3] => E:\www\App\Examples\Blog\Lib\Behavior\CheckLangBehavior.class.php<br class="calibre5"></br>[4] => E:\www\App\Examples\Blog\Lib\Action\BlogAction.class.php<br class="calibre5"></br>[5] => E:\www\App\Examples\Blog\Lib\Action\PublicAction.class.php<br class="calibre5"></br>[6] => E:\www\App\ThinkPHP\Lib\Core\Model.class.php<br class="calibre5"></br>[7] => E:\www\App\ThinkPHP\Lib\Core\Db.class.php<br class="calibre5"></br>[8] => E:\www\App\ThinkPHP\Lib\Driver\Db\DbMysql.class.php<br class="calibre5"></br>[9] => E:\www\App\Examples\Blog\Runtime\Data\_fields\examples.Category.php<br class="calibre5"></br>[10] => E:\www\App\Examples\Blog\Lib\Model\AdvModel.class.php<br class="calibre5"></br>[11] => E:\www\App\Examples\Blog\Runtime\Data\_fields\examples.Blog.php<br class="calibre5"></br>[12] => E:\www\App\Examples\Blog\Runtime\Data\_fields\examples.Comment.php<br class="calibre5"></br>[13] => E:\www\App\Examples\Blog\Runtime\Data\_fields\examples.Tag.php<br class="calibre5"></br>[14] => E:\www\App\Examples\Blog\Lib\Model\BlogViewModel.class.php<br class="calibre5"></br>[15] => E:\www\App\Examples\Blog\Lib\Model\ViewModel.class.php<br class="calibre5"></br>[16] => E:\www\App\Examples\Blog\Lib\Model\BlogModel.class.php<br class="calibre5"></br>[17] => E:\www\App\Examples\Blog\Lib\Model\CategoryModel.class.php<br class="calibre5"></br>[18] => E:\www\App\Examples\Blog\Lib\ORG\Page.class.php<br class="calibre5"></br>[19] => E:\www\App\Examples\Blog\Runtime\Cache\2ab73b774a28fab5232b8c752b654018.php`
[上一页](11.html "上一页")[下一页](13.html "下一页")
- 序言
- 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 大事记
- 鸣谢
- 关于