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

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

[CodeIgniter4]讲解-启动流程的更多相关文章

  1. Android 7.0 Gallery图库源码分析2 - 分析启动流程

    前面一讲解了Gallery启动Activity以及界面如何绘制,现在开始讲解启动流程的代码逻辑. GalleryActivity的onCreate方法中调用initializeByIntent()方法 ...

  2. linux开机启动流程及需要开机启动服务讲解和修改及防火墙

    linux系统从开机到登陆的启动流程. 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核kernel 5.启动init进程 6.读取inittab文件,执行rc.sysinit ...

  3. Tomcat源码分析之—具体启动流程分析

    从Tomcat启动调用栈可知,Bootstrap类的main方法为整个Tomcat的入口,在init初始化Bootstrap类的时候为设置Catalina的工作路径也就是Catalina_HOME信息 ...

  4. CentOS6 启动流程图文解剖

    我们在使用Linux操作系统的时候,我们只需按下电源键,等待,然后输入账户和密码就可以使用Linux操作系统了.那么在按下电源到输入账号和密码之前,操作系统都做了些什么?下面就来讲述在这段时间发生的动 ...

  5. 转:OK6410内存及启动流程

    一.内存 只是从大体上介绍,并没有涉及寄存器的操作 6410的系统资源为:256MB DDR .2GB NANDFlash 如下图所示: ROM是只读存储器,RAM是随机存储器. 区别: 1.ROM( ...

  6. Recovery启动流程(3)--recovery.cpp分析

    转载请注明来源:cuixiaolei的技术博客 这篇文章主要通过分析高通recovery目录下的recovery.cpp源码,对recovery启动流程有一个宏观的了解.MTK和高通的recovery ...

  7. Recovery启动流程(2)---UI界面

    转载请注明来源:cuixiaolei的技术博客 Recovery启动流程系列文章把recvoery目录下文件分成小块讲解,最后再以一条主线贯穿所有的内容.这篇文章主要讲解Recovery-UI的相关内 ...

  8. Linux的启动流程以及GRUB详解

     一.Linux引导和启动流程       概述,计算机电源接通后通过BISO之后,没有问题,就会去硬盘上找到MBR(Main Boot Record 主引导记录区)位于整个硬盘的0磁道0柱面1扇区, ...

  9. ASP.NET Core MVC 源码学习:MVC 启动流程详解

    前言 在 上一篇 文章中,我们学习了 ASP.NET Core MVC 的路由模块,那么在本篇文章中,主要是对 ASP.NET Core MVC 启动流程的一个学习. ASP.NET Core 是新一 ...

随机推荐

  1. vscode中内置集成终端显示为git(bash.exe)

    按下快捷键 ctrl+` (其中的点是esc键下英文状态的点)调出vscode集成终端,也可从菜单栏的“查看→终端”中调出,默认显示的是系统cmd: 在设置中搜索 integrated shell 将 ...

  2. STM8 关闭PWM输出后的电平输出问题解决

    STM系列的单片机PWM输出如果被关断比如用TIM1_CtrlPWMOutputs进行停止输出后,电平的高低处于不确定的状态. 他取决于: 1.GPIO初始化的特性 2.关断那一刻时的电平 3.CCM ...

  3. UML类图的情话诉说

    你知道吗这个世界是个繁杂而又简单的世界 你我在冥冥中都有联系 有时候,你像我的妈妈一样,对你依赖满满, 没有你我不知道何去何从(依赖) 有时候,看你,真如我亲爱孩子般,想一直拥你入我怀抱,但我知道终究 ...

  4. laravel 服务容器的由来 代码展示

    <?php /** * 目的:代码的完善来说明从 基础类的调用到 工厂类的使用 再到容器的出现的原因 * (首先要明白工厂类和容器的关系 可以理解:容器就是工厂类的升级版(为了解决类的依赖)) ...

  5. 【Nginx入门系列】第四章 通过域名匹配虚拟主机,不修改端口

    域名访问原理 我们在显示生活中,我们怎样通过一个域名来访问到我们所需要的网站呢? 例如www.baidu.com,我们在浏览器输入百度网址会先发送请求到DNS服务器,DNS会通过我们的域名解析百度对应 ...

  6. SpringBoot性能优化之HikariCP连接池

    以前一直使用阿里Druid数据库连接池,这段时间听说有个号称速度最快.代码最简的后起之秀——HikariCP,于是动手实践一下 1.依赖如下: <?xml version="1.0&q ...

  7. Solaris磁盘镜像恢复

    注:此文章笔者实验记录,欢迎大家指正 Solaris磁盘镜像恢复方法一: 系统启动,开机提示子镜像需要维护: 查看磁盘镜像信息 进入系统后,metastat -pc 和metadb #查看镜像状态与m ...

  8. [Python]逻辑运算符 and or

    复习老男孩全栈二期视频的时候 圆号老师测试的用例两个集合and 和or操作的时候的问题 >>> a = set("what") >>> b = ...

  9. Codeforces_711_B

    http://codeforces.com/problemset/problem/711/B 比较简单,过程有点繁琐,先找一行包含那个0的行,得到和,以此填出0位置的值,然后判断这个矩阵是否符合条件. ...

  10. Ansible: hosts文件拆分为inventory和定义inventory全局变量

    前言 随着管理机器的增多,我们在使用Ansible的时候时常会遇到hosts文件过于冗长的问题,极其不便于管理,而将hosts文件拆分为inventory就可解决该问题:另外,hosts中的每个主机条 ...