sanli 发表于 2019-6-25 11:44:08

CodeIgniter4 - 启动流程

CodeIgniter 是一个小巧但功能强大的 PHP 框架,作为一个简单而“优雅”的工具包,它可以为开发者们建立功能完善的 Web 应用程序。
来自CodeIgniter中国的介绍CodeIgniter 是一个轻量级、快速、灵活和安全的PHP全栈Web框架。
CodeIgniter4 是一个完整的重写,将质量和代码带入一个更现代的版本,同时仍然保持着许多完整的东西
来自CodeIgniter4 Github的介绍CodeIgniter4 启动流程分析个人阅读笔记,仅作参考,若有错误后续改正简要说明
[*]入口文件index.php进行一些初始化动作
[*]调用框架引导文件System\bootstrap.php预定义常量及加载相关类库,然后对CodeIgniter\CodeIgniter进行初始化并返回
[*]调用CodeIgniter\CodeIgniter->run()执行主流程并返回响应结果
入口文件 - public\index.php
[*]检测 PHP 版本 >= 7.2
[*]定义前端入口路径FCPATH
[*]将当前路径修改为工作目录
[*]加载并实例化项目路径配置类 app/Config/Paths.php
[*]加载框架引导文件 bootstrap.php,并实例化框架核心类 CodeIgniter\CodeIgniter ,下文简称 CI 类,执行过程如下
[*]执行 CI->run(),解析请求、路由,执行控制器并返回响应结果
框架引导文件 - System\bootstrap.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实例化\CodeIgniter\Debug\Exceptions

      return static::getSharedInstance('exceptions', $config, $request, $response);
[*]通过\CodeIgniter\Debug\Exceptions->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()
[*]开始基准测试
[*]获取CodeIgniter\HTTP\Request对象
[*]获取CodeIgniter\HTTP\Response对象
[*]检测安全访问(Https)
[*]检测Request魔术方法($_POST['_method'])
[*]执行pre_system事件触发器
[*]实例化Config\Cache,根据当前URI检测缓存,存在则直接输出响应结果
[*]调用CI->handleRequest()处理请求,详细解析见下文
      $this->handleRequest($routes, $cacheConfig, $returnResponse);处理请求 - CI->handleRequest()
[*]解析当前请求路由并获取过滤器$routeFilter
[*]实例化过滤器CodeIgniter\Filters\Filters
[*]检测$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

Hex 发表于 2019-6-29 09:33:51

好文章~

lightwave88 发表于 2019-11-13 00:23:13

讚,現在有 4 的文件嗎

连普科技 发表于 2020-2-28 11:45:24

一脸懵:(

chito 发表于 2020-5-20 14:11:39

突然发现CI4的性能比CI3差不少。
用CI4处理同样的请求,需要500ms,而用CI3则在200ms左右。怎么优化提升CI4的性能啊?
页: [1]
查看完整版本: CodeIgniter4 - 启动流程