[CI]CodeIgniter系统流程
------------------------------------------------------------------------------------------------------
进入框架入口文件index.php =>
定义应用的当前环境(用于设置错误模式):define('ENVIRONMENT', 'development');
设置系统文件目录名:$system_path = 'system';
设置应用文件目录名:$application_folder = 'application'; //可自定义
定义当前文件名常量:define('SELF', pathinfo(__FILE__, PATHINFO_BASEPATH));
定义PHP文件后缀常量:define('EXT', '.php'); //这个全局常量不推荐使用
定义系统目录路径常量:define('BASEPATH', str_replace('\\', '/', $system_path));
定义前端控制器文件路径常量:define('FCPATH', str_replace(SELF, '', __FILE__));
定义系统目录名常量:define('SYSDIR', trim(strchr(trim(BASEPATH, '/'), '/'), '/'));
定义应用目录路径常量:define('APPPATH', BASEPATH.$application_folder.'/');
加载引导文件:require_once BASEPATH.'core/CodeIgniter.php';
---------------------------------@黑眼诗人 <www.farwish.com>---------------------------------
进入系统初始化文件CodeIgniter.php =>
define('CI_VERSION', '2.2.0');
define('CI_CORE', FALSE);
require(BASEPATH.'core/Common.php'); //引入公共函数库文件,包含load_class()等函数
require(APPPATH.'config/'.ENVIRONMENT.'/constants.php'); //引入框架常量文件,文件和目录模式 & 文件流模式
set_error_handler('_exception_handler'); //定义一个自定义错误处理程序以便记录PHP错误
if ( ! is_php('5.3'))
{
@set_magic_quotes_runtime(0); // Kill magic quotes
}
if (isset($assign_to_config['subclass_prefix']) AND $assign_to_config['subclass_prefix'] != '')
//设置子类前缀
{
get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix']));
}
if (function_exists("set_time_limit") == TRUE AND @ini_get("safe_mode") == 0)
//设置一个自由的脚本执行时间限制
{
@set_time_limit(300);
}
$BM =& load_class('Benchmark', 'core');
//实例化Benchmark基准类,此类使你可以标记点并计算它们之间时间差,内存消耗也可以显示
$BM->mark('total_execution_time_start');
//基准标记,总执行时间开始:$this->marker['total_execution_time_start'] = microtime();
$BM->mark('loading_time:_base_classes_start');
//基准标记,加载的时间:$this->marker['loading_time:_base_classes_start'] = microtime();
$EXT =& load_class('Hooks', 'core'); //实例化Hooks钩子类,提供一种不堆砌来扩展基础系统的机制
$EXT->_call_hook('pre_system'); //调用指定钩子pre_system
$CFG =& load_class('Config', 'core'); //实例化Config配置类,包含管理配置文件的方法
if (isset($assign_to_config))
{
$CFG->_assign_to_config($assign_to_config);
//调用Config.php中_assign_to_config方法,保证配置项通过变量被分配 和 重写
}
$UNI =& load_class('Utf8', 'core'); //实例化Utf8类,对UTF-8环境提供支持
$URI =& load_class('URI', 'core'); //实例化URI类,解析URI 和 决定路由
$RTR =& load_class('Router', 'core'); //实例化Router路由类,解析URI 和 决定路由
$RTR->_set_routing(); //这个函数确定什么应该是基于URI请求,以及 路由配置文件中设置的路由
if (isset($routing))
{
$RTR->_set_overrides($routing); //设置控制器覆盖
}
$OUT =& load_class('Output', 'core'); //实例化Output输出类,负责发送最终的输出到浏览器
if ($EXT->_call_hook('cache_override') === FALSE)
{
if ($OUT->_display_cache($CFG, $URI) == TRUE)
{
exit; //检测是否有缓存文件,如果有,直接退出当前脚本
}
}
$SEC =& load_class('Security', 'core'); //实例化Security安全类
$IN =& load_class('Input', 'core'); //实例化Input输入类,为了安全对全局输入数据预处理
$LANG =& load_class('Lang', 'core'); //实例化Lang语言类
require BASEPATH.'core/Controller.php';, //引入 基础控制器类
function &get_instance()
{
return CI_Controller::get_instance(); //返回静态变量$instance
}
if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'))
{
require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';
//引入自定义扩展 基础控制器类
}
if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php'))
{
show_error('Unable to load your default controller. Please make sure the controller specified in your Routes.php file is valid.');
}
include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().'.php');
//加载本地控制器
$BM->mark('loading_time:_base_classes_end');
//基准标记,加载的时间结束:$this->marker['loading_time:_base_classes_end'] = microtime();
安全检查
$EXT->_call_hook('pre_controller'); //调用"pre_controller" hook
$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start'); //基准标记,控制器执行时间标记点
$CI = new $class(); //实例化请求控制器
$EXT->_call_hook('post_controller_constructor'); //调用"post_controller_constructor" hook
调用请求的方法
$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end'); //基准标记,控制器执行时间结束标记点
$EXT->_call_hook('post_controller'); //调用"post_controller" hook
if ($EXT->_call_hook('display_override') === FALSE)
{
$OUT->_display(); //发送最后的渲染输出到浏览器
}
$EXT->_call_hook('post_system'); //调用"post_system" hook
if (class_exists('CI_DB') AND isset($CI->db))
{
$CI->db->close(); //关闭数据库连接
}
-------------------------------------------------------------------------------------------------
[CI]CodeIgniter系统流程的更多相关文章
- CodeIgniter框架——CI的执行流程
应用程序流程图 CodeIgniter执行流程 源码分析——CI到底做了些什么 (由welcome的例子出发——讲解index.php——讲解CodeIgniter.php) (load_class的 ...
- Docker最全教程之使用TeamCity来完成内部CI、CD流程(十六)
本篇教程主要讲解基于容器服务搭建TeamCity服务,并且完成内部项目的CI流程配置.教程中也分享了一个简单的CI.CD流程,仅作探讨.不过由于篇幅有限,完整的DevOps,我们后续独立探讨. 为了降 ...
- PHP框架CI CodeIgniter 的log_message开启日志记录方法
PHP框架CI CodeIgniter 的log_message开启日志记录方法 第一步:index.php文件,修改环境为开发环境define(‘ENVIRONMENT’, ‘development ...
- CI CD系统整合
转载_CI 系统搭建:Git.Gerrit与Jenkins 2014-08-11 20:55 15678人阅读 评论(1) 收藏 举报 分类: 软件集成和项目管理(3) 目录(?)[+] 去年写的这五 ...
- Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave(二)
一.说明 1.1 说明 前面介绍采用 Jenkinsfile + KubernetesPod.yaml 方式进行部署项目(Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-s ...
- 基于 Kubernetes 实践弹性的 CI/CD 系统
大家好,我是来自阿里云容器服务团队的华相.首先简单解释一下何为 Kubernetes 来帮助大家理解.Kuberentes 是一个生产可用的容器编排系统.Kuberentes 一方面在集群中把所有 N ...
- 用 GitHub Action 构建一套 CI/CD 系统
缘起 Nebula Graph 最早的自动化测试是使用搭建在 Azure 上的 Jenkins,配合着 GitHub 的 Webhook 实现的,在用户提交 Pull Request 时,加个 r ...
- Gitea 与 Jenkins 的集成实践,打造你的专属 CI/CD 系统
前言 Gitea 是一个用于代码托管的轻量级单体程序,它能与现有的经典应用集成,诸如代码分析工具 SonarQube.持续集成工具 Drone.Jenkins 以及用于工单管理的客户端插件(VSCod ...
- 升鲜宝V2.0_生鲜配送行业,对生鲜配送行业的思考及对系统流程开发的反思_升鲜宝生鲜配送系统_15382353715_余东升
升鲜宝V2.0_生鲜配送行业,对生鲜配送行业的思考及对系统流程开发的反思_升鲜宝生鲜配送系统_15382353715_余东升 -----生鲜配送行业现状及存在问题----- 1. 从业者整体素质偏低 ...
随机推荐
- python实现排序算法(一)——插入排序算法
''' 插入排序算法 原始数据data 排序数据后数据SortedData,默认是从小打大排序 1.从data第一个元素开始,该元素赋值给SortedData[0],可以认为SortedData已经被 ...
- tips:Java基本数据类型大小比较
tips:Java基本数据类型大小比较! Java语言提供了八种基本类型.六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型. ------四个整数型------ (1)byte:b ...
- 【原创】重装Windows系统后Android studio无需重装,直接迁移
每次重装Windows系统后重装各种开发环境让人苦不堪言,比如VS2013 +补丁,没有个小半天根本搞不定! 对与Android的开发者,同样安装JDK+Android Studio + Adnroi ...
- Hbase访问方式
Hbase访问方式 Hbase shell命令操作 Hbase shell命令操作--general操作 首先启动Hbase 启动shell 查看表结构 删除一个表 创建表和查看表结构 插入几条数据 ...
- Java 1-Java 基础语法
一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一条狗是一个对象,它的 ...
- Android被忽略的tools
自动生成的布局xml文件,很多都带有tools字样:但是大部分都被我们删除了: 其实它的作用是让我们这些开发者预览用的,十分的方便: 事例一个TextView: <TextView androi ...
- Guava实现 过滤文本,排序,转换内容,分组计数转换map 等等
重要点 :看注释 从access.log中统计数据 对healthcheck.html的请求不计入统计 输出请求总量,以及GET和POST分别的总量 输出请求最频繁的10个接口及其次数,按次数降序 输 ...
- django之模板系统 --》内容(filter过滤器、tags标签【for、if、with】、母板以及继承、crf_token、注释、组件、静态文件【load static】、get_static_prefix、自定义标签和tag)
常用: Django模板中只需要记两种特殊符号: {{ }}和 {% %} {{ }}表示变量,在模板渲染的时候替换成值,{% %}表示逻辑相关的操作. 变量 {{ 变量名 }} 变量名由字母数字和下 ...
- android 开发 实现一个带图片Image的ListView
注意:这种实现方法不是实现ListView的最优方法,只是希望通过练习了解ListView的实现原理 思维路线: 1.创建drawable文件夹将要使用的图片导入进去 2.写一个类,用于存放图片ID数 ...
- 2、申请苹果App ID
在“iOS Certificates”页面“Identifiers"下选择“App IDs",可查看到已申请的所有App ID,点击右上角的加号可创建新“App ID”:打开“Re ...