CodeIgniter 的生命周期
index.php system/core/CodeIgniter.php
CI 的生命周期,两个文件就表达清楚了,php 的执行始于 index.php,终于 core/CodeIgniter.php。前面提到的超级对象,只是 core/CodeIgniter.php 的一个环节生成、使用的。
index.php
各种配置、参数定义
没有什么业务逻辑,主要是初始化
设置运行环境 product、development 或者 development
为了安全,可以将 system 和 application 目录转移到其他位置
include system/core/CodeIgniter.php
末了 include core/CodeIgniter.php
index.php 的代码执行完了
system/core/CodeIgniter.php
一开始依然是各中参数定义,引入常数、配置
include('core/commons.php')
引入常用函数
commons.php 最重要的函数就是 load_class() 了
还有两个重要的是 config 相关的 get_config() 和 config_item()
没这三个 CI 起不来。
config/constants.php
引入 application 下某个位置的 config/constants.php,主要是文件/文件夹操作相关的常数设置。
其他配置
错误处理函数、运行时间限制等等
load_class()
Load benchmark、hooks
第一个被加载的核心类是这个,Benchmark
hooks,CI 运行过程中的里程碑可以说是由 Hooks 来标记的。后面的 hook 都由它来打理
hook: pre_system
这里对 CI 来说其实什么业务都还开始代码执行到这里,你想做点什么就去配置对应的 config/hooks.php,pre_system 指的是加载完 benchmark 和 hooks 之后的一个逻辑代码插入点。
Load Config、Utf8、URI、Router、Output
pre_system 之后还是接着刚才的 load_class() 一口气加载 Config、Utf8、URI、Router、Output 五个类并实例化,根据构造函数还执行了一些业务逻辑:
Config 是接着前面 config_get() 的劳动成果,初始化一些配置,并设置参数 base_url 的值
utf8 设置了一些常数开关
URI、Router、Output 这时候可以说什么也没干
hook: cache_override
撇开钩子不说,在业务逻辑上,执行到这里,程序已经有足够的工具资源来查找缓存文件了,虽然超级对象还没被实例化,但是 Output 对象已经有了,所需要的 URI、Config 对象也已经有了。
如果没有钩子,返回缓存内容,直接 exit()。所以这里来个钩子,就是插入处理读取缓存以及其他相关操作的业务代码,从而覆盖 CI 默认的 output::_display_cache(),返回完缓存内容记得 exit()。
Load Security、Input、Lang
Security生成一个 CSQF 待使用。Input 把 $_GET、$_POST、$_COOKIE 的值都处理了一遍。Lang需要 debug 时写一条 log。
载入 core/Controller.php,以及扩展文件,如果有的话。通过路由查找对应的控制器,确认类存在,确认所需的方法是否合法,不能下划线开始, 不能是 CI_Controller 的方法。一切顺利就 include 控制器所在的文件,否则 404。
hook: pre_controller
走到这个点,就所有准备工作都做得差不多,万事具备只欠东风。可是设置影响控制器实例化的参数,主要是通过变量、参数修改来影响它的构造函数执行。
$CI = new $class();
实例化控制器 $CI = new $class(),在 CI_Controller 的构造函数里,Loader 类被加载了。
仅仅这一行代码之后,钩子 post_controller_constructor 出现。
hook: post_controller_constructor
两个 hook 之间就这么一个语句。
这时候还没开始处理业务请求,只是让你开始开始准备处理业务请求,给你一个钩子,你想干啥就干啥吧,主要是通过变量、参数修改来影响具体控制器方法 的执行。在这个环节之后,你写的控制器方法才被启用,首先是找一下有没有 _remap,有的话重定向到相应的方法上,如果最后调用控制器的方法失败就是 404 了。
hook: post_controller
hook: display_override
hook: post_system
display_override 如果没有逻辑代码要执行的话,就使用 Output::_display() 输出 view。这里的 hook 就是替代 Output::_display()处理要输出的字符串,和前面的 output::_display_cache() 差不多,只不过前面是 PHP 处理从缓存文件来的数据,这里是处理 PHP 临时生成的字符串的数据。
清理数据库连接
最后,清理一下 DB 资源了。
转载于:https://www.cnblogs.com/kudosharry/articles/2731115.html