业余花了点时间看看CodeIgniter框架(简称CI),CI目前的稳定版本是 3.X,4.0版本已经出来了,但还在测试中,所以我分析的还是 3.x 版本。
CI是一个很轻便的框架,整个下载包也就2M多,而且使用起来方便快捷,适用于一些简单的功能开发,以及做app 接口。
该框架整个流程图如下:
  1. index.php 文件作为前端控制器,初始化运行 CodeIgniter 所需的基本资源;
  2. Router 检查 HTTP 请求,以确定如何处理该请求;
  3. 如果存在缓存文件,将直接输出到浏览器,不用走下面正常的系统流程;
  4. 在加载应用程序控制器之前,对 HTTP 请求以及任何用户提交的数据进行安全检查;
  5. 控制器加载模型、核心类库、辅助函数以及其他所有处理请求所需的资源;
  6. 最后一步,渲染视图并发送至浏览器,如果开启了缓存,视图被会先缓存起来用于 后续的请求。
下载框架源码,解压得到如下代码结构:

主要有三个目录:
1、application目录:用于开发者编写相应的配置以及逻辑处理,开发者只需在这个目录下添加自己需要的开发文件。
2、system目录:框架的系统库,里面包括核心库,类库,辅助类库,数据库等,这些文件,开发者最好不要擅自修改,它是整个框架的龙脉。
3、user_guide:用户手册。

接下来看看源码的请求流程:
首先假设有一个 URL 请求,入口就是 index.php,该文件定义了几个常量,应用的路径,以及核心库的路径等。
接着引入 核心库system/core下的 CodeIgniter.php文件,该文件初始化核心库system/core里的类库,分别是:
{● benchmark: "Benchmark",● hooks: "Hooks",● config: "Config",● log: "Log",● utf8: "Utf8",● uri: "URI",● router: "Router",● output: "Output",● security: "Security",● input: "Input",● lang: "Lang",● loader: "Loader"
}
每个类库的注释在上图已有解释。
同时也加载 应用项目 application/config目录下的配置文件(这些配置文件都是开发者根据自己的需要去添加与配置),根据判断加载字符串处理库mbstring,添加错误异常预处理方法。在加载的同时,也把钩子部署到了相应位置,如果开发者定义了相应钩子实现方法,就会在相应的位置执行。
在 CodeIgniter.php 初始化核心库的时候定义了五个钩子,分别如下:
  • pre_system 在系统执行的早期调用,这个时候只有 基准测试类 和 钩子类 被加载了, 还没有执行到路由或其他的流程。
  • pre_controller 在你的控制器调用之前执行,所有的基础类都已加载,路由和安全检查也已经完成。
  • post_controller_constructor 在你的控制器实例化之后立即执行,控制器的任何方法都还尚未调用。
  • post_controller 在你的控制器完全运行结束时执行。
  • post_system 在最终的页面发送到浏览器之后、在系统的最后期被调用。
然后,实例化 CI_Controller 类:

 function &get_instance()
{return CI_Controller::get_instance();
}
通过路由 router 及 uri 得到请求的 controller控制器、method方法 以及参数,执行该方法。
期间根据开发者在application/config目录下的配置,会加载相应的 librays 类库、 helper辅助函数 及 DB 库。
如果你喜欢MVC的开发模式,也可以添加model类,然后加载 model 模型类,处理相应的业务逻辑。
最后在自己定义的controller控制器处理好的数据结果渲染在html 页面上,展示给用户。

下面看一下CI框架几个重要部分:

模型

模型就是传统的 MVC 模式下的M,专门用来和数据库打交道的 PHP 类,开发者在 application/models 目录下定义自己的模型类,都要继承 模型基类 CI_Mode。当你在控制下调用模型,只需要下面一行代码就实例化了:
$this->load->model('model_name');

辅助函数

辅助函数,顾名思义,是帮助我们完成特定任务的函数。system/helpers 目录下都是辅助类。调用的方式如下:$this->load->helper('name');
当然开发者也可以创建自己的辅助类,文件存放在 application/helpers 目录下,调用的方式与系统
的辅助类一致。
$this->load 就是 Loader.php 文件CI_Load 类实例, 我们来看看 CI_Load 类下的 helper() 函数:
/*** Helper Loader** @param  string|string[] $helpers    Helper name(s)* @return    object*/public function helper($helpers = array()){is_array($helpers) OR $helpers = array($helpers);foreach ($helpers as &$helper){$filename = basename($helper);$filepath = ($filename === $helper) ? '' : substr($helper, 0, strlen($helper) - strlen($filename));$filename = strtolower(preg_replace('#(_helper)?(\.php)?$#i', '', $filename)).'_helper';$helper   = $filepath.$filename;if (isset($this->_ci_helpers[$helper])){continue;}// Is this a helper extension request?$ext_helper = config_item('subclass_prefix').$filename;$ext_loaded = FALSE;foreach ($this->_ci_helper_paths as $path){if (file_exists($path.'helpers/'.$ext_helper.'.php')){include_once($path.'helpers/'.$ext_helper.'.php');$ext_loaded = TRUE;}}// If we have loaded extensions - check if the base one is hereif ($ext_loaded === TRUE){$base_helper = BASEPATH.'helpers/'.$helper.'.php';if ( ! file_exists($base_helper)){show_error('Unable to load the requested file: helpers/'.$helper.'.php');}include_once($base_helper);$this->_ci_helpers[$helper] = TRUE;log_message('info', 'Helper loaded: '.$helper);continue;}// No extensions found ... try loading regular helpers and/or overridesforeach ($this->_ci_helper_paths as $path){if (file_exists($path.'helpers/'.$helper.'.php')){include_once($path.'helpers/'.$helper.'.php');$this->_ci_helpers[$helper] = TRUE;log_message('info', 'Helper loaded: '.$helper);break;}}// unable to load the helperif ( ! isset($this->_ci_helpers[$helper])){show_error('Unable to load the requested file: helpers/'.$helper.'.php');}}return $this;}

这段代码主要是 加载(include_once) system/helpers 与 appliation/helpers 目录下的 $name_helper.php 名称文件,自定义的辅助函数文件需要添加 前缀 来与 系统的辅助函数区分开。当执行完加载函数,就能得到 $this->name 实例,然后调用它里面的函数。
所有辅助函数如下:
  • 数组辅助函数
  • 验证码辅助函数
  • Cookie 辅助函数
  • 日期辅助函数
  • 目录辅助函数
  • 下载辅助函数
  • 邮件辅助函数
  • 文件辅助函数
  • 表单辅助函数
  • HTML 辅助函数
  • Inflector 辅助函数
  • 语言辅助函数
  • 数字辅助函数
  • 路径辅助函数
  • 安全辅助函数
  • 表情辅助函数
  • 字符串辅助函数
  • 文本辅助函数
  • 排版辅助函数
  • URL 辅助函数
  • XML 辅助函数

CI 类库

所有的系统类库都位于 system/libraries/ 目录下,大多数情况下,在使用之前, 你要先在控制器中初始化它,使用下面的方法:
$this->load->library('class_name');
'class_name' 是你想要调用的类库名称,例如,要加载 表单验证类库,你可以这样做:
$this->load->library('form_validation');
一旦类库被载入,你就可以根据该类库的用户指南中介绍的方法去使用它了,这个类似于辅助函数。
同样拓展自己的类库也是在application/libraries 目录下。
一旦加载,你就可以使用小写字母名称来访问你的类,调用方法:
$this->someclass->some_method();
所有的类库如下:
  • 基准测试类
  • 缓存驱动器
  • 日历类
  • 购物车类
  • 配置类
  • Email 类
  • 加密类
  • 加密类(新版)
  • 文件上传类
  • 表单验证类
  • FTP 类
  • 图像处理类
  • 输入类
  • Javascript 类
  • 语言类
  • 加载器类
  • 迁移类
  • 输出类
  • 分页类
  • 模板解析类
  • 安全类
  • Session 类
  • HTML 表格类
  • 引用通告类
  • 排版类
  • 单元测试类
  • URI 类
  • 用户代理类
  • XML-RPC 与 XML-RPC 服务器类
  • Zip 编码类

数据库

CI框架封装了多种数据库驱动与连接方法,让你轻松配置就能连接上,且封装了一些查询构造器与生成查询结果,让代码看起来方便简洁。
你只需 在application/config/database.php 文件下配置你链接的参数:
$db['default'] = array('dsn' => '','hostname' => 'localhost','username' => '','password' => '','database' => '','dbdriver' => 'mysqli','dbprefix' => '','pconnect' => FALSE,'db_debug' => (ENVIRONMENT !== 'production'),'cache_on' => FALSE,'cachedir' => '','char_set' => 'utf8','dbcollat' => 'utf8_general_ci','swap_pre' => '','encrypt' => FALSE,'compress' => FALSE,'stricton' => FALSE,'failover' => array(),'save_queries' => TRUE
);
然后在 Controller 里调用一句 :$this->load->database(); 就能连接上数据库。
接着,你可以查询你想要的结果:
$this->db->where('name',$name);
$query=$this->db->get('mytable',10,20);
// Executes: SELECT * FROM mytable where name=$nameLIMIT 20, 10

CI框架也提供了数据库的事务处理,如:
$this->db->trans_start();$this->db->query('AN SQL QUERY...');$this->db->query('ANOTHER QUERY...');$this->db->query('AND YET ANOTHER QUERY...');$this->db->trans_complete();

提供了简单的查询缓存:

将查询结果对象会被序列化并保存到服务器上的一个文本文件中。 当下次再访问该页面时,会直接使用缓存文件而不用访问数据库了。只有读类型(SELECT)的查询可以被缓存。 这个相对应 Java 的hibernate 数据库映射 就弱化了很多,Java提供了三级的缓存方式,而且在查询数据库的时候,并不会每次都断开,再连接。
以上都是CI框架提供的重要组成部分,也许它可能满足不了你所有的需求,但也提供了一些给你拓展的方式,如在application/core目录下添加你的核心类,这都是CI框架已考虑到的问题。当然它在处理一些繁杂的业务逻辑的时候,还是比较薄弱的,比如说权限使用,模块灵活增删等。
CI框架主要是以轻便,快捷上手为主要的优势,让你去处理一些简单的项目。它介于一个没有框架与一个比较笨重的框架之间,所以一个框架好不好用,还要基于你的需求。
CI框架还提供了一些其它便捷的开发帮助,它有有自己的模板引擎,也有程序分析:
你可以在你的 控制器 方法的任何位置添加一行下面的代码:
$this->output->enable_profiler(TRUE);
设置基准测试点
$this->benchmark->mark('code_start');// Some code happens here$this->benchmark->mark('code_end');echo$this->benchmark->elapsed_time('code_start','code_end');
最后输出分析的信息:
$sections=array('config'=>TRUE,'queries'=>TRUE);$this->output->set_profiler_sections($sections);

下表列出了可用的分析器字段和用来访问这些字段的 key :
Key Description Default
benchmarks 在各个计时点花费的时间以及总时间 TRUE  
config CodeIgniter 配置变量 TRUE  
controller_info 被请求的控制器类和调用的方法 TRUE  
get 请求中的所有 GET 数据 TRUE  
http_headers 本次请求的 HTTP 头部 TRUE  
memory_usage 本次请求消耗的内存(单位字节) TRUE  
post 请求中的所有 POST 数据 TRUE  
queries 列出所有执行的数据库查询,以及执行时间 TRUE  
uri_string 本次请求的 URI TRUE  
session_data 当前会话中存储的数据 TRUE  
query_toggle_count 指定显示多少个数据库查询,剩下的则默认折叠起来 25  
以上是我对CI框架大致的了解与分析,我做php的经验不多,这是我第一个尝试去深入了解的php框架,请大家多多指教。

CI框架浅析(全篇)相关推荐

  1. 【CI3.1】CI框架简单使用方法

    CI框架简单使用方法 1.回忆MVC1.1.M:模型,提供数据,保存数据1.2.V:视图,只负责显示,表单form1.3.C:控制器,协调模型和视图1.4.action:动作,是控制器中的方法,用于被 ...

  2. ci框架 mysql_CodeIgniter (CI)框架中的数据库查询汇总

    引言: 前两天业务涉及到一个拉取答题排行榜的需求,数据库里数据是这样的: 同一个人可能提交过多次成绩,所以同一个人可能会有多次记录: 同一个人提交的多次成绩中可能有至少两次成绩是一样的. 于是,查询的 ...

  3. CI框架如何删除地址栏的 index.php

    默认 CI 框架显示地址是 http://localhost/ci/index.php/test/ 去掉index.php这样会更好些. 1.修改Http.conf的 LoadModule rewri ...

  4. 最简单的CI框架入门示例--数据库取数据

    这个写给初学者看,这是最简单可以调通的例子,网上很多例子其实初学者本地跑不通,缺这少那. 1.下载CI框架(自己找) 2.配置 database.php配置:     为数据库服务器设置 connec ...

  5. CI框架css引入出现问题

    初次使用CI框架,使用base_url()引入css等资源的时候,源码看起来没有错,但是点击以后发现重复路径了.最后才知道是自己的配置没有写好. 在config.php中 $config['base_ ...

  6. PHP CI框架目录结构及运行机制

    CI目录结构 CI主要组成部分为,application(应用文件夹).system(系统文件夹)和index.php入口文件. 应用文件夹中主要是存放控制器.模型和视图等,系统文件夹中主要是存放组成 ...

  7. CI框架表单提交数据接收乱码

    2019独角兽企业重金招聘Python工程师标准>>> 下午再用CI (2.25) 提交表单发现post过来的数据是乱码.文档编码,浏览器解析编码都是GBK. request显示是正 ...

  8. 雷林鹏分享:解决CI框架的Disallowed Key Characters错误提示

    用CI框架时,有时候会遇到这么一个问题,打开网页,只显示 Disallowed Key Characters 错误提示.有人说 url 里有非法字符.但是确定 url 是纯英文的,问题还是出来了.但清 ...

  9. php ci项目总结,分享关于php CI框架使用的一点小总结

    最近频繁使用CI框架,这里主要是关于后台的开发,重点分享关于Model和Controller层的一点点总结: 1.涉及到交互数据库,我们先在database.php总添加我们需要使用的数据库的连接信息 ...

最新文章

  1. encodeURIComponent的用法
  2. html 和 body标签的 css 设置
  3. android 设置PopupWindow的显示大小
  4. 解决:bash: vim: command not found、docker 容器不识别 vi / vim 、docker 容器中安装 vim
  5. Linux下libxml2编程基础
  6. Ajax基石脚本异步并发调用参数传递
  7. git reflog
  8. linux简单的操作命令
  9. layui扩展第三方模块_Layui集成第三方插件nicescroll
  10. 【作图】origin制作图中图
  11. acme申请泛域名证书
  12. 5-2 jmu-java-m05-自定义Judgeable接口 (10分)
  13. BeEF-XSS实验手记
  14. 网站优化 SEO概念
  15. 【正点原子MP157连载】第二章 Ubuntu系统入门-摘自【正点原子】【正点原子】STM32MP1嵌入式Linux驱动开发指南V1.7
  16. 2022年财富世界500强研究报告
  17. “网上下单”生活神技能,寄快递在线下单、查快递实时物流信息
  18. 优达(Udacity)-机器学习基础-数据集与问题(安然数据集)
  19. SQL中grant的用法
  20. STM32F103C8T6控制电机驱动模块298N驱动电机调速以及正反转(附代码资源包)

热门文章

  1. 一文详解编程中的随机数
  2. Windows的HooK技术实现(支持X86/X64版本)
  3. 51单片机学习:LCD1602液晶显示实验
  4. 华夏历史人物之「王阳明」
  5. MDK 5.36 can‘t add xxx to analyzer
  6. 成就你一生的100个哲理61-70
  7. vb程序设计题(新)
  8. Proposal Thesis 模版和资源
  9. C语言经典100例(014,015,016)
  10. Python字典与集合练习题