CI执行过程剖析

来源:互联网 发布:linux的7种运行级别 编辑:程序博客网 时间:2024/06/05 02:51

1、CI 中index.php文件的主要功能是:定义项目的相关路径常量,最后,加载CodeIninter.php文件,后面的事情交给他处理

2、在CodeIninter.php文件中,主要功能有:
a:加载CI核心的公共文件Common.php,内置的方法在系统全局中都会被用到,特别是:&load_class(),is_loaded(),&get_config(),config_item()函数,
b:加载文件读写属性的配置文件:constants.php
c:利用函数&load_class()加载获取某一段程序执行时间的类文件:Benchmark.php
d:利用函数&load_class()加载钩子类:Hooks.php
1:初始化时,加载了配置类Config,获取项目目录下config.php文件的配置项
2:判断在配置文件中是否开启了钩子,然后加载项目下面config/hooks.php钩子的配置文件
e:利用上一步实例化的钩子对象,来执行一个在系统执行之前执行的钩子”pre_system”,这个钩子的内容需要用户自己在hooks.php文件中配置,若不存在就不执行
f:用&load_class()加载配置类Config,做的工作是判断是否存在需要存入配置文件的变量,如果有,就存入,否则,不执行。
g:用&load_class()加载UTF8类,这个类主要是处理项目的编码的一些事情,比较简单。
h:用&load_class()加载URI类,主要是处理URI的,方便我们在项目中直接调用。
i:加载路由类Router,然后执行_set_routing()来设置路由。
j:加载输出类:Output
k:运行钩子:$EXT->_call_hook(‘cache_override’)
l:加载安全类:Security,主要是对数据进行消毒的。
m:加载输入类Input,设置获取get.post.cookie.server变量的函数,然后可以对他们进行消毒
n:加载语言类:Lang
o:加载核心控制器Controller类,通过引用方式(&)返回核心控制器的对象。
p:判断在项目的核心目录下面是否存在MY_Controller的拓展控制器,如果有,那就require_once();
q:根据路由类(Router)获取到的控制器($RTR->fetch_class()),来加载controlers下面的该控制器
///////////////////////////////////////////////////////////////////////////////////////////
到上面为止呢,系统当前执行的加载已经完毕了,既然刚刚加载我们项目的控制器,那么接下来就应该调用我们项目的控制器了
继续:
//////////////////////////////////////////////////////////////////////////////////////////
a:通过路由类来获取当前需要执行的控制器($RTR->fetch_class())和方法($RTR->fetch_method()),然后判断类和方法的合法性
b:运行钩子:$EXT->_call_hook(‘pre_controller’),在调用你的任何控制器之前调用
c:实例化项目当前路由捕获到的类,
d:运行钩子:$EXT->_call_hook(‘post_controller_constructor’);控制器实例化之后,任何方法调用之前调用.
e:判断当前的控制器中是否存在方法:_remap();,如果存在,那就直接调用该方法。否则,调用由路由捕获的方法;
f:运行钩子$EXT->_call_hook(‘post_controller’) 控制器完全运行之后调用.
g:运行钩子$EXT->_call_hook(‘post_system’);在最终着色页面发送到浏览器之后,浏览器接收完最终数据的系统执行末尾调用
h:判断是否打开数据库连接,关闭数据库连接。
//////////////////////////////////////////////////////////////////////////////
这样子,我们一个项目就运行完了。(PS:这个当然很多更加深入的就没有进行下去了,比如说路由是怎么实现的等。下次更新。。。)

架构分析查看:http://www.360doc.com/content/11/0320/21/6524307_102997671.shtml