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
过滤器,并针对结果RedirectResponse
ResponseInterface
进行处理 - 启动控制器
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
网友评论