[CodeIgniter4]讲解-启动流程

2020-03-04 18:58:14 浏览数 (1)

https://codeigniter.org.cn/forums/thread-31030-1-1.html

CodeIgniter 是一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工具包,它可以为开发者们建立功能完善的 Web 应用程序。来自CodeIgniter中国的介绍 CodeIgniter 是一个轻量级、快速、灵活和安全的PHP全栈Web框架。CodeIgniter4 是一个完整的重写,将质量和代码带入一个更现代的版本,同时仍然保持着许多完整的东西来自CodeIgniter4 Github的介绍 CodeIgniter4 启动流程分析 个人阅读笔记,仅作参考,若有错误后续改正 简要说明 入口文件index.php进行一些初始化动作 调用框架引导文件Systembootstrap.php预定义常量及加载相关类库,然后对CodeIgniterCodeIgniter进行初始化并返回 调用CodeIgniterCodeIgniter->run()执行主流程并返回响应结果 入口文件 - publicindex.php 检测 PHP 版本 >= 7.2 定义前端入口路径FCPATH 将当前路径修改为工作目录 加载并实例化项目路径配置类 app/Config/Paths.php 加载框架引导文件 bootstrap.php,并实例化框架核心类 CodeIgniterCodeIgniter ,下文简称 CI 类,执行过程如下 执行 CI->run(),解析请求、路由,执行控制器并返回响应结果 框架引导文件 - Systembootstrap.php 引导文件主要做了以下几件事 预定义常量 加载相关类库 引入包管理工具Composer 解析环境配置 .env 初始化框架核心类 CI 预定义常量路径相关常量 项目路径 - APPPATH 项目根路径 - ROOTPATH 框架路径 - SYSTEMPATH 可写文件夹路径 - WRITEPATH 测试用例路径 - TESTPATH 项目常量 项目命名空间 - APP_NAMESPACE Composer Autoload 路径 - COMPOSER_PATH 时间单位常量 - SECOND MINUTE HOUR DAY MONTH YEAR DECADE 退出状态码 - EXIT_* 加载类库 加载框架公共函数库 加载AUTOLOADER,并注册spl_autoload_register 检测Composer,存在则加载 加载并解析 env 配置,默认是 ROOTPATH.env 加载框架的URL辅助函数库 初始化核心框架类CI 实例化框架核心类 CI 并初始化,初始化主要做了以下事情 根据配置设置默认时区,未配置则默认UTC 通过Services实例化CodeIgniterDebugExceptions         return static::getSharedInstance('exceptions', $config, $request, $response); 通过CodeIgniterDebugExceptions->initialize()注册异常处理         //Set the Exception Handler        set_exception_handler([$this, 'exceptionHandler']);        // Set the Error Handler        set_error_handler([$this, 'errorHandler']);        // Set the handler for shutdown to catch Parse errors        // Do we need this in PHP7?        register_shutdown_function([$this, 'shutdownHandler']); 检测并加载项目对应的环境启动配置 Config/Boot/ENVIRONMENT(环境).php 根据CI_DEBUG标志来加载调试类库Kint 返回CI类 执行主流程 - CI->run() 开始基准测试 获取CodeIgniterHTTPRequest对象 获取CodeIgniterHTTPResponse对象 检测安全访问(Https) 检测Request魔术方法($_POST['_method']) 执行pre_system事件触发器 实例化ConfigCache,根据当前URI检测缓存,存在则直接输出响应结果 调用CI->handleRequest()处理请求,详细解析见下文         $this->handleRequest($routes, $cacheConfig, $returnResponse);处理请求 - CI->handleRequest() 解析当前请求路由并获取过滤器$routeFilter 实例化过滤器CodeIgniterFiltersFilters 检测$routeFilter过滤器,不为空则启用before after 过滤器 获取$uri,针对Web CLI两种模式进行了处理 检测SPARKED标志,未定义则运行当前的before过滤器,并针对结果RedirectResponseResponseInterface 进行处理 启动控制器CI->startController(),若当前控制器是闭包Closure则执行并返回执行结果,如果当前控制器为空、不存在或方法不存在则返回异常 如果当前控制器不是闭包且存在则创建控制器CI->createController(),实例并初始化控制器 初始化Request Response Logger 检测Https 载入辅助函数库 执行post_controller_constructor事件触发器 运行控制器CI->runController() 检测 Controller->_remap方法 存在则传入Controller->method及请求参数调用_remap 不存在则直接调用Controller->method 返回相应输出 聚合输出gatherOutput,根据缓存标志对文本响应结果进行缓存 检测SPARKED标志,未定义则传入Response到after过滤器处理,获取返回的Response 存储当前URI信息,然后移除$uri $_SESSION['_ci_previous_url'] = (string) $uri; 根据$returnResponse参数 false则执行发送响应报文CI->sendResponse() 执行post_system事件触发器 返回响应$this->response

  • 入口文件index.php进行一些初始化动作
  • 调用框架引导文件Systembootstrap.php预定义常量及加载相关类库,然后对CodeIgniterCodeIgniter进行初始化并返回
  • 调用CodeIgniterCodeIgniter->run()执行主流程并返回响应结果

入口文件 - publicindex.php

  • 检测 PHP 版本 >= 7.2
  • 定义前端入口路径FCPATH
  • 将当前路径修改为工作目录
  • 加载并实例化项目路径配置类 app/Config/Paths.php
  • 加载框架引导文件 bootstrap.php,并实例化框架核心类 CodeIgniterCodeIgniter ,下文简称 CI 类,执行过程如下
  • 执行 CI->run(),解析请求、路由,执行控制器并返回响应结果

框架引导文件 - Systembootstrap.php 引导文件主要做了以下几件事

  • 预定义常量
  • 加载相关类库
  • 引入包管理工具Composer
  • 解析环境配置 .env
  • 初始化框架核心类 CI

预定义常量路径相关常量

  • 项目路径 - APPPATH
  • 项目根路径 - ROOTPATH
  • 框架路径 - SYSTEMPATH
  • 可写文件夹路径 - WRITEPATH
  • 测试用例路径 - TESTPATH

项目常量

  • 项目命名空间 - APP_NAMESPACE
  • Composer Autoload 路径 - COMPOSER_PATH
  • 时间单位常量 - SECOND MINUTE HOUR DAY MONTH YEAR DECADE
  • 退出状态码 - EXIT_*

加载类库

  • 加载框架公共函数库
  • 加载AUTOLOADER,并注册spl_autoload_register
  • 检测Composer,存在则加载
  • 加载并解析 env 配置,默认是 ROOTPATH.env
  • 加载框架的URL辅助函数库

初始化核心框架类CI

  • 实例化框架核心类 CI 并初始化,初始化主要做了以下事情
    • 根据配置设置默认时区,未配置则默认UTC
    • 通过Services实例化CodeIgniterDebugExceptions

return static::getSharedInstance('exceptions', $config, $request, $response);

  • 通过CodeIgniterDebugExceptions->initialize()注册异常处理

//Set the Exception Handler        set_exception_handler([$this, 'exceptionHandler']);        // Set the Error Handler        set_error_handler([$this, 'errorHandler']);        // Set the handler for shutdown to catch Parse errors // Do we need this in PHP7?        register_shutdown_function([$this, 'shutdownHandler']);

  • 检测并加载项目对应的环境启动配置 Config/Boot/ENVIRONMENT(环境).php
  • 根据CI_DEBUG标志来加载调试类库Kint
  • 返回CI类

执行主流程 - CI->run()

  • 开始基准测试
  • 获取CodeIgniterHTTPRequest对象
  • 获取CodeIgniterHTTPResponse对象
  • 检测安全访问(Https)
  • 检测Request魔术方法($_POST['_method'])
  • 执行pre_system事件触发器
  • 实例化ConfigCache,根据当前URI检测缓存,存在则直接输出响应结果
  • 调用CI->handleRequest()处理请求,详细解析见下文

$this->handleRequest($routes, $cacheConfig, $returnResponse);处理请求 - CI->handleRequest()

  • 解析当前请求路由并获取过滤器$routeFilter
  • 实例化过滤器CodeIgniterFiltersFilters
  • 检测$routeFilter过滤器,不为空则启用before after 过滤器
  • 获取$uri,针对Web CLI两种模式进行了处理
  • 检测SPARKED标志,未定义则运行当前的before过滤器,并针对结果RedirectResponseResponseInterface 进行处理
  • 启动控制器CI->startController(),若当前控制器是闭包Closure则执行并返回执行结果,如果当前控制器为空、不存在或方法不存在则返回异常
  • 如果当前控制器不是闭包且存在则创建控制器CI->createController(),实例并初始化控制器
    • 初始化Request Response Logger
    • 检测Https
    • 载入辅助函数库
  • 执行post_controller_constructor事件触发器
  • 运行控制器CI->runController()
    • 检测 Controller->_remap方法
      • 存在则传入Controller->method及请求参数调用_remap
      • 不存在则直接调用Controller->method
    • 返回相应输出
  • 聚合输出gatherOutput,根据缓存标志对文本响应结果进行缓存
  • 检测SPARKED标志,未定义则传入Response到after过滤器处理,获取返回的Response
  • 存储当前URI信息,然后移除$uri

$_SESSION['_ci_previous_url'] = (string) $uri;

  • 根据$returnResponse参数
    • false则执行发送响应报文CI->sendResponse()
  • 执行post_system事件触发器
  • 返回响应$this->response

0 人点赞