Index.php作为CI框架的入口文件,源码分析,自然而然由此开始。在源码分析的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现,如果英文水平很好的话,读过index.php文件的英文注释之后也就基本明白了inde.php都做了些什么。本来想第一篇写解析CI框架的目录结构的,像这一般网上一搜都是一大堆,也就放弃了这个想法。博主是基于CodeIgniter-v3.1.0最新版本进行解读分析。ok,书归正传,在博主看来CI框架的index.php文件一共完成了四项工作:

① 设置框架应用的环境状态

② 配置系统、应用、视图等程序目录以及得到其路径

③ 系统、应用、视图等目录的正确性验证

④ 载入 core/CodeIgniter.php框架核心文件,启动框架

1、设置框架应用的环境状态

define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');

这里的development可以是任何你喜欢的环境名称(比如working,再如debug),相对应的,你要在下面的switch case代码块中,对设定的环境做相关的错误等级控制。(CI框架设置了三种应用场景状态,分别是:development(开发),testing(测试),production(产品)。development(开发)状态,也就是默认的状态下会产生错误报告,testing(测试),production(产品)状态下则不会产生错误报告)否则,CI框架会认为你没有配置好相应的环境,从而退出进程并给出对应的错误信息:

    default:
//header() 被用来发送自定义的 HTTP 报文。关于HTTP报文的更多信息请参考php手册
header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);
echo 'The application environment is not set correctly.';
exit(1);

之所以一定要配置配置ENVIRONMENT?这是因为,CI框架中很多组件都依赖于ENVIRONMENT的配置,例如,查看system/config/Common.php, 这其中有一段引入配置文件的代码,是这样实现的:

    if (file_exists(APPPATH . 'config/' . ENVIRONMENT . '/mimes.php')) {
$_mimes = include(APPPATH . 'config/' . ENVIRONMENT . '/mimes.php');
} elseif (file_exists(APPPATH . 'config/mimes.php')) {
$_mimes = include(APPPATH . 'config/mimes.php');
} else {
$_mimes = array();
}

在CI框架中,很多配置文件都是通过这种方式引入的,因此ENVRIONMENT对于CI框架的正确运行时必须的,所以需要在开始的时候配置好ENVIRONMENT。设置ENVIRONMENT的一个好处是:可以很方便的切换系统的配置而不必修改系统代码。例如,在系统进入测试阶段时,database配置为测试的数据库,而在系统测试完毕时,database切换到线上的数据库。这好比是用一个开关控制了系统的环境切换,自然是非常方便的。

2、配置系统、应用、视图等程序目录以及得到其路径

CI框架允许你将系统核心源码和应用程序代码进行分开放置,但是你必须设定好系统的system文件夹和application文件夹(同样,文件夹名字可以是任何合法的文件夹名称,而不一定使用’system’和’application’)的名称、路径等信息:

    //定义系统目录名称
$system_path = 'system'; //定义你的应用目录名称
$application_folder = 'application'; //视图文件存放目录
//如果要将视图目录移到应用程序目录,则设置在此处的路径。如果空白,它将默认为您的应用程序目录中的标准位置。
$view_folder = '';

下面有这样一段代码,然后很多人就不明白为什么要放这样几句代码了,在这里特别说明一下:

    if (defined('STDIN')) {
//chdir函数用来改变目录
chdir(dirname(__FILE__));
}

这段代码主要是用来干嘛的呢?首先,STDIN、STDOUT、STDERR是PHP以 CLI(Command Line Interface)模式运行而定义的三个常量,这三个常量类似于Shell的stdin,stdout,stdout,分别是PHP CLI模式下的标准输入、标准输出和标准错误流。也就是说,这三行代码是为了保证命令行模式下,CI框架可以正常运行。

3、系统、应用、视图等目录的正确性验证

1) 系统(system)文件目录的正确性验证

    //得到规范化的绝对路径名
//此段代码用于判断生成system系统文件目录
if (($_temp = realpath($system_path)) !== FALSE) {
//$system_path就是当前你的CI框架核心文件所存放的绝对路径名
$system_path = $_temp . DIRECTORY_SEPARATOR;
} else {
$system_path = strtr(rtrim($system_path, '/\\'), '/\\', DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
} //如果$system_path所指向的文件目录不存在,则die
if (!is_dir($system_path)) {
header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);
echo 'Your system folder path does not appear to be set correctly. Please open the following file and correct this: ' . pathinfo(__FILE__, PATHINFO_BASENAME);
exit(3); // EXIT_CONFIG
}

2) 应用(application)文件目录的正确性验证

    //此段代码用于判断生成application应用文件目录
if (is_dir($application_folder)) {
if (($_temp = realpath($application_folder)) !== FALSE) {
$application_folder = $_temp;
} else {
$application_folder = strtr(rtrim($application_folder, '/\\'), '/\\', DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR);
}
} elseif (is_dir(BASEPATH . $application_folder . DIRECTORY_SEPARATOR)) {
$application_folder = BASEPATH . strtr(trim($application_folder, '/\\'), '/\\', DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR);
} else {
header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);
echo 'Your application folder path does not appear to be set correctly. Please open the following file and correct this: ' . SELF;
exit(3);
}

3) 视图(view)文件目录的正确性验证

    //此段代码用于判断生成view视图文件目录
if (!isset($view_folder[0]) && is_dir(APPPATH . 'views' . DIRECTORY_SEPARATOR)) {
$view_folder = APPPATH . 'views';
} elseif (is_dir($view_folder)) {
if (($_temp = realpath($view_folder)) !== FALSE) {
$view_folder = $_temp;
} else {
$view_folder = strtr(rtrim($view_folder, '/\\'), '/\\', DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR);
}
} elseif (is_dir(APPPATH . $view_folder . DIRECTORY_SEPARATOR)) {
$view_folder = APPPATH . strtr(trim($view_folder, '/\\'), '/\\', DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR);
} else {
header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);
echo 'Your view folder path does not appear to be set correctly. Please open the following file and correct this: ' . SELF;
exit(3);
}

几个定义的常量(PATH结尾的常量表示目录路径,DIR结尾的变量表示目录名):

    //SELF(这里指index.php文件)
define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));
//BASEPATH(system文件夹的路径)
define('BASEPATH', $system_path);
//FCPATH(前端控制器的路径)
define('FCPATH', dirname(__FILE__) . DIRECTORY_SEPARATOR);
//SYSDIR(系统system目录名)
define('SYSDIR', basename(BASEPATH));
//APPPATH(应用程序路径)
define('APPPATH', $application_folder . DIRECTORY_SEPARATOR);
//VIEWPATH(视图目录路径)
define('VIEWPATH', $view_folder . DIRECTORY_SEPARATOR);

注:查看所有常量的方法:

    var_dump(get_defined_constants());

4、载入 core/CodeIgniter.php框架核心文件,启动框架

入口文件的最后一行,引入CodeIgniter.php框架核心文件(也是下一步框架执行的关键)。CodeIgniter.php被称为bootstrap file,也就是它是一个引导文件,是CI框架执行流程的核心文件

    //最后就是加载CI框架的核心引导文件了
require_once BASEPATH . 'core/CodeIgniter.php';

总结一下,index.php并没有做太多复杂的工作,而是类似军队中押运粮草的,兵马未动粮草先行,为CI框架的运行提供了一系列配置参数和正确性验证,而这些配置和验证,是CI框架能够正常运行的关键。

文章转自:https://blog.csdn.net/zhihua_w/article/details/52815892

关注微信公众号:lovephp

CI 框架源码解析一之入口文件 index.php的更多相关文章

  1. CI框架源码阅读笔记4 引导文件CodeIgniter.php

    到了这里,终于进入CI框架的核心了.既然是“引导”文件,那么就是对用户的请求.参数等做相应的导向,让用户请求和数据流按照正确的线路各就各位.例如,用户的请求url: http://you.host.c ...

  2. CI框架源码阅读笔记5 基准测试 BenchMark.php

    上一篇博客(CI框架源码阅读笔记4 引导文件CodeIgniter.php)中,我们已经看到:CI中核心流程的核心功能都是由不同的组件来完成的.这些组件类似于一个一个单独的模块,不同的模块完成不同的功 ...

  3. CI框架源码阅读笔记2 一切的入口 index.php

    上一节(CI框架源码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考: 作为CI框架的入口文件,源码阅读,自然由此开始.在源码阅读的过程中, ...

  4. CI框架源码阅读笔记3 全局函数Common.php

    从本篇开始,将深入CI框架的内部,一步步去探索这个框架的实现.结构和设计. Common.php文件定义了一系列的全局函数(一般来说,全局函数具有最高的加载优先权,因此大多数的框架中BootStrap ...

  5. Gin框架源码解析

    Gin框架源码解析 Gin框架是golang的一个常用的web框架,最近一个项目中需要使用到它,所以对这个框架进行了学习.gin包非常短小精悍,不过主要包含的路由,中间件,日志都有了.我们可以追着代码 ...

  6. JUC源码学习笔记5——线程池,FutureTask,Executor框架源码解析

    JUC源码学习笔记5--线程池,FutureTask,Executor框架源码解析 源码基于JDK8 参考了美团技术博客 https://tech.meituan.com/2020/04/02/jav ...

  7. JDK源码及其他框架源码解析随笔地址导航

    置顶一篇文章,主要是整理一下写过的JDK中各个类的源码及其他框架源码解析的文章,方便自己随时阅读也方便网友朋友们阅读与指正 基础篇 从为什么String=String谈到StringBuilder和S ...

  8. CI框架源码阅读笔记1 - 环境准备、基本术语和框架流程

    最开始使用CI框架的时候,就打算写一个CI源码阅读的笔记系列,可惜虎头蛇尾,一直没有行动.最近项目少,总算是有了一些时间去写一些东西.于是准备将之前的一些笔记和经验记录下来,一方面权作备忘,另一方面时 ...

  9. iOS开发之Masonry框架源码解析

    Masonry是iOS在控件布局中经常使用的一个轻量级框架,Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...

随机推荐

  1. Unity C# 关于Attribute的使用

    最近在研究Attribute,感觉挺好玩,搜到一篇不错的文章,分享给大家 原文:未知?找到后补上! 举两个例子,在变量上使用[SerializeFiled]属性,可以强制让变量进行序列化,可以在Uni ...

  2. 创建Brush对象

    在GDI+中,可使用笔刷,以各种个颜色和图像填充图形,GDI+的Brush类本身是一个抽象的类,所以是不能实例化Brush的 但是GDI+的API提供五个类,就扩展了Brush类并提供了具体的实现方式 ...

  3. dt4.0上传图片总是压缩解决办法,为什么我设置了不压缩图片,程序还是压缩呢?

    即使后台设置也解决不了图片被压缩的厄运如图: 解决办法: 这个是上传控件名称和版本号 这个是文件的路径 在文档中找到 compress: 把windth和height后面的1600 改成更大的数值就可 ...

  4. Java中的各种锁

    .共享锁和排它锁的区别

  5. Python中的基本数据类型之列表与元组初步了解

    一.什么是列表 1.列表是Python中的基本数据类型之一用[]来表示,每一项元素由逗号隔开,列表什么都能装,(能装对象的对象) 2.可以用来存放大量数据 3.是一个可以改变的数据类型 二.列表的索引 ...

  6. Javascript的map与forEach的区别

    原理: 高级浏览器支持forEach方法语法:forEach和map都支持2个参数:一个是回调函数(item,index,list)和上下文: forEach:用来遍历数组中的每一项:这个方法执行是没 ...

  7. 织梦上传webp格式图片

    织梦cms如何添加其他格式的图片呢? 这里以webp为类来实现一下如何让织梦支持webp 1.修改系统设置让织梦(dede)支持该图片格式,比如:webp(新图片格式) 系统->系统基本参数-& ...

  8. 转:解决“arcsde服务启动又停止的问题” - shmiloy001的专栏 - 博客频道 - CSDN.NET

      )查看原因     该问题产生的原因可查看文件:F:\Program Files\ArcGIS\ArcSDE\ora11gexe\etc\sde_esri_sde.log     文件中提示密码失 ...

  9. python if else while for

    1 getpass模块 设置密码不显示明文 用户名和密码输入程序: import getpass username = input("username:") password = ...

  10. 深入了解MongoDB

    一.介绍: 数据库分为关系型数据库和非关系型数据库 关系型数据库是建立在关系模型上的数据库,主要的有Oracle MySQL Microsoft SQL Server NoSQL是非关系型数据存储的广 ...