因为公司技术栈上用到了TP5.0框架,抽空看了下框架底层的架构设计,画了个思维导图用于技术指导,在此分享。

图片版

文字版

入口文件

定义APP_PATH

加载引导文件 thinkphp/start.php

引导文件

加载基础文件 thinkphp/base.php

  • 加载系统常量定义

  • 加载环境变量定义文件.env

  • 注册自动加载机制

    • Composer 自动加载支持
    • 注册命名空间 think、behavior、traits
    • 自动加载 extend 目录
  • 注册错误和异常处理机制

    • 设置报错等级 E_ALL

    • 设置错误处理程序 Error::appError

    • 设置异常处理程序 Error::appException

    • php脚本的析构函数 Error::appShutdown

      • 日志写入 Log::save()

        • 监听行为 log_write_done
  • 加载惯例配置文件 thinkphp\convention.php

执行应用 App::run()

执行应用

初始化

App::initCommon()

  • 注册应用命名空间 app

  • 初始化应用App::init()

    • 加载应用配置 config.php 加载数据库配置 database.php 加载extra目录下的所有扩展配置文件 加载应用状态配置 “app_status”.php 加载行为扩展 tags.php 加载公共文件 common.php
    • 返回配置数组
  • 调试模式 config.app_debug

  • 注册的根命名空间 config.root_namespace

  • 加载额外文件 config.extra_file_list

    • 助手函数库,thinkphp/helper.php
  • 设置系统时区 config.default_timezone

  • 监听行为 app_init

  • 返回配置数组

访问绑定

  • 模块/控制器绑定 defined(‘BIND_MODULE’)
  • 入口自动绑定 config.auto_bind_module

设置全局过滤方法 config.default_filter

多语言

  • 设置默认语言 config.default_lang
  • 开启多语言 config.lang_switch_on
  • 加载系统语言包 thinkphp/lang/zh-cn.php application/lang/zh-cn.php

应用调度信息

  • 监听行为 app_dispatch 可直接设置调度

  • 路由检测

    • 路由到模块/控制器
    • 路由到控制器的方法
    • 路由到类的方法
    • 路由到重定向地址
    • 路由到闭包函数
  • 调试模式下记录 Log::record()

    • ROUTE调度信息
    • HEADER请求头
    • PARAM请求参数

监听行为 app_begin 可修改调度

请求缓存检查

  • 是否开启请求缓存 config.request_cache
  • 请求缓存有效期 config.request_cache_expire
  • 全局请求缓存排除规则config.request_cache_except

执行调用分发 App:exec() 并返回执行结果数据

  • module 模块/控制器/操作

    • 多模块部署 config.app_multi_module

      • 绑定模块
      • 初始化模块 App::init()
      • 模块请求缓存检查
    • 设置默认过滤机制

    • 自动转换控制器和操作名为小写 config.url_convert

    • 获取控制器名,默认为 config.default_controller

    • 获取方法名,默认为 config.default_action 是否转换为驼峰命名 config.action_convert

    • 监听行为 module_init 参数为 Request 对象

    • 实例化控制器类

      • 控制器层名称,默认为 config.url_controller_layer
      • 控制器类后缀,config.controller_suffix
      • 空控制器名称,默认为 config.empty_controller
    • 控制器类中的方法是否存在

    • 监听行为 action_begin 可修改 controller 对象、执行方法

    • 执行类的方法(使用PHP内置反射类)

      • 参数绑定

        • 请求参数绑定
        • 支持依赖注入
      • 运行控制方法…

      • if:View()->fetch() 监听行为 view_filter 可修改视图文本

  • controller 执行控制器操作

  • method 回调方法

  • redirect 重定向跳转

  • function 闭包 App::invokeFunction()

  • response Response 实例

清空类的实例化 Loader::clearInstance()

输出数据到客户端

  • 封装为 Response 对象

    • 未指定数据类型时,自动识别响应输出类型

      • ajax请求 config.default_ajax_return
      • 默认请求 config.default_return_type

监听行为 app_end 可修改 Response 对象

发送到客户端 Response()->send()

  • 监听行为 response_send 参数为 Response 对象
  • Trace调试注入 config.app_trace
  • 发送状态码HTTP CODE、发送头部信息 HTTP HEADER
  • 打印数据 echo
  • 提高页面响应 fastcgi_finish_request() 立即冲刷数据到客户端
  • 监听行为 response_end 参数为 Response 对象

XMind - Trial Version

原文件下载