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

上一节(CI框架源码阅读笔记1 - 环境准备、基本术语和框架流程)中,我们提到了CI框架的基本流程,这里再次贴出流程图,以备参考:




  作为CI框架的入口文件,源码阅读,自然由此开始。在源码阅读的过程中,我们并不会逐行进行解释,而只解释核心的功能和实现。

1. 设置应用程序环境

define("ENVIRONMENT", "development");

这里的development可以是任何你喜欢的环境名称(比如dev,再如test),相对应的,你要在下面的switch case代码块中,对设定的环境做相关的错误控制,否则,CI框架会认为你没有配置好相应的环境,从而退出进程并给出对应的错误信息:

default:     exit("The application environment is not set correctly.");

为什么一开始就要配置ENVIRONMENT?这是因为,CI框架中很多组件都依赖于ENVIRONMENT的配置,我们看一下system中,引用ENVIRONMENT的地方:


  可以看到,很多组件都依赖于ENVIRONMENT.例如,查看system/config/Common.php, 这其中有一段引入配置文件的代码,是这样实现的:

if ( ! defined("ENVIRONMENT") OR ! file_exists($file_path = APPPATH."config/".ENVIRONMENT."/config.php"))
{
    $file_path = APPPATH."config/config.php";
}

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

2.  配置系统目录和应用程序目录

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

$system_path = "system";
$application_folder = "application";

接下来,有这么一段代码:

if (defined("STDIN"))
{
     chdir(dirname(__FILE__));
}

  这段代码是干嘛的呢?首先,STDINSTDOUTSTDERR是PHP以 CLI(Command
Line Interface
)模式运行而定义的三个常量,这三个常量类似于Shell的stdin,stdout,stdout,分别是PHP CLI模式下的标准输入标准输出标准错误流。也就是说,这三行代码是为了保证命令行模式下,CI框架可以正常运行。关于PHP
CLI的更多细节可以参考:http://www.php-cli.com/

3. system目录的正确性验证和application目录验证

(1). system目录的正确性验证
  Realpath返回的是目录或文件的绝对目录名(没有最后的/)

if (realpath($system_path) !== FALSE)
{
    $system_path = realpath($system_path)."/";
}
$system_path = rtrim($system_path, "/")."/";
if ( ! is_dir($system_path))
{
    exit("xxxxxxxx");
}

几个定义的常量(PATH结尾的常量表示目录路径,DIR结尾的变量表示目录名):
a. SELF(这里指index.php文件)
b. EXT(deprecated,废弃的,不必关注)
c. BASEPATH(system文件夹的路径)
d. FCPATH(前端控制器的路径)
e. SYSDIR(系统system目录名)
f. APPPATH(应用程序路径)
查看所有定义的常量的方法:

Print_r(get_defined_constants());

(2)application的目录验证。

代码较简单,不做过多的解释:

if (is_dir($application_folder))
{
    define("APPPATH", $application_folder."/");
}
else
{
    if ( ! is_dir(BASEPATH.$application_folder."/"))
    {
        exit("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".SELF);
    }

    define("APPPATH", BASEPATH.$application_folder."/");
}

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

require_once BASEPATH."core/CodeIgniter.php";

  总结一下,index.php并没有做太多复杂的工作,而是类似一个后勤,为CI框架的运行提供了一系列配置参数和正确性验证,而这些配置和验证,是CI框架能够正常运行的关键。

  最后,按照惯例,贴一下整个文件的源码(简化注释版):

 1 <?php
 2
 3 define("ENVIRONMENT", "development");
 4
 5 if (defined("ENVIRONMENT"))
 6 {
 7     switch (ENVIRONMENT)
 8     {
 9         case "development":
10             error_reporting(E_ALL);
11         break;
12
13         case "testing":
14         case "production":
15             error_reporting(0);
16         break;
17
18         default:
19             exit("The application environment is not set correctly.");
20     }
21 }
22
23 /*
24  * SYSTEM FOLDER NAME
25  */
26 $system_path = "system";
27
28 /*
29  * APPLICATION FOLDER NAME
30  */
31 $application_folder = "application";
32
33 /*
34  *  Resolve the system path for increased reliability
35  */
36 if (defined("STDIN"))
37 {
38     chdir(dirname(__FILE__));
39 }
40
41 if (realpath($system_path) !== FALSE)
42 {
43     $system_path = realpath($system_path)."/";
44 }
45
46 $system_path = rtrim($system_path, "/")."/";
47
48 if ( ! is_dir($system_path))
49 {
50     exit("xxxxxxxx");
51 }
52
53 /*
54  *  set the main path constants
55  */
56 // The name of THIS file
57 define("SELF", pathinfo(__FILE__, PATHINFO_BASENAME));
58
59 // this global constant is deprecataaed.
60 define("EXT", ".php");
61
62 // Path to the system folder
63 define("BASEPATH", str_replace("\\", "/", $system_path));
64
65 // Path to the front controller (this file)
66 define("FCPATH", str_replace(SELF, "", __FILE__));
67
68 // Name of the "system folder"
69 define("SYSDIR", trim(strrchr(trim(BASEPATH, "/"), "/"), "/"));
70
71 // The path to the "application" folder
72 if (is_dir($application_folder))
73 {
74     define("APPPATH", $application_folder."/");
75 }
76 else
77 {
78     if ( ! is_dir(BASEPATH.$application_folder."/"))
79     {
80         exit("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".SELF);
81     }
82
83     define("APPPATH", BASEPATH.$application_folder."/");
84 }
85
86 require_once BASEPATH."core/CodeIgniter.php";

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索框架
, 文件
, application
, ci框架
, ci 异步
, 配置
, 常量
, environment
, 框架源码核心
, 商城框架ajaxasp.net源码
, php源码
, path模式配置
, 源码阅读
框架入口文件
ci框架去掉index.php、ci框架隐藏index.php、ci框架index.php、无法加载index ci框架、后盾网ci框架源码,以便于您获取更多的相关知识。

时间: 2024-08-04 10:05:15

CI框架源码阅读笔记2 一切的入口 index.php的相关文章

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

由于BenchMark是CI中第一个加载的core组件,因此我们的分析首先从该组件开始.BenchMark的含义非常明确,使用过BenchMark工具的同学应该比较清楚,这是一个基准组件.既然是BenchMark,我们便可大胆猜想,BM组件的主要功能就是记录程序的运行时间.内存使用.cpu使用等情况.     这个组件结构较简单,只有一个marker内部变量和三个对外的接口:   1 Elapsed_time 2 Mark 3 Memory_usage 下面一个个展开来看:   1. mark

CI框架源码阅读,系统常量文件constants.php的配置_php技巧

配置系统常量 1.当文件系统工作的时候检查并配置这些首选项文件系统运行的时候这些默认的值会适当的增加系统的安全性,但是在php或apache的底层单独的为每各用户开一个进程的时候,使用八进制的值永远是正确的FILE_READ_MODE 读取文件的模式FILE_WRITE_MODE   写入文件的模式DIR_READ_MODE   读取目录的模式DIR_WRITE_MODE 写入目录的模式  2.文件流模式当我们使用fopen()/popen()的时候需要这些模式define('FOPEN_REA

Three.js源码阅读笔记(Object3D类)_基础知识

这是Three.js源码阅读笔记的第二篇,直接开始. Core::Object3D Object3D似乎是Three.js框架中最重要的类,相当一部分其他的类都是继承自Object3D类,比如场景类.几何形体类.相机类.光照类等等:他们都是3D空间中的对象,所以称为Object3D类.Object3D构造函数如下: 复制代码 代码如下: THREE.Object3D = function () { THREE.Object3DLibrary.push( this ); this.id = THR

Apache Storm源码阅读笔记&amp;OLAP在大数据时代的挑战

 <一>Apache Storm源码阅读笔记 楔子 自从建了Spark交流的QQ群之后,热情加入的同学不少,大家不仅对Spark很热衷对于Storm也是充满好奇.大家都提到一个问题就是有关storm内部实现机理的资料比较少,理解起来非常费劲. 尽管自己也陆续对storm的源码走读发表了一些博文,当时写的时候比较匆忙,有时候衔接的不是太好,此番做了一些整理,主要是针对TridentTopology部分,修改过的内容采用pdf格式发布,方便打印. 文章中有些内容的理解得益于徐明明和fxjwind两

php中get_adjacent_post函数PHP源码阅读笔记

这个函数是wordpress里的一个函数,作用是获取相邻的POST文章. 函数并不大,有效代码大概只有70行左右,但是里面包含的知识不少,所以专门用一篇文章来解释一下. get_adjacent_post函数的源码位于wp-includes/link-template.php中. 我会通过"//roc:"在引出源码阅读笔记. /**  * Retrieve adjacent post.  *  * Can either be next or previous post.  *  * @

CI框架源码解读之利用Hook.php文件完成功能扩展的方法_php实例

本文实例讲述了CI框架源码解读之利用Hook.php文件完成功能扩展的方法.分享给大家供大家参考,具体如下: 看了hook.php的源码,就知道CI使用hook来进行扩展的原理了. hook的基本知识 http://codeigniter.org.cn/user_guide/general/hooks.html CI中hook的使用经历了一个:开启hook,定义hook,调用hook,执行hook的过程. 手册中已经告知了开启.定义.调用的方法.那么hook的实现原理是啥呢. <?php if

PHP yii框架源码阅读(二) 整体执行流程分析

一 程序入口 <?php // change the following paths if necessary $yii=dirname(__FILE__).'/http://www.cnblogs.com/framework/yii.php'; $config=dirname(__FILE__).'/protected/config/main.php'; // remove the following line when in production mode // defined('YII_D

Three.js源码阅读笔记(基础的核心Core对象)_基础知识

Three.js是一个比较伟大的webgl开源库,它简化了浏览器3D编程,使得使用JavaScript在浏览器中创建复杂的场景变得容易很多.Github上众多webgl demo令我兴奋不已,跃跃欲试.由于这个库还处在开发阶段,因此资料非常匮乏,爱好者大部分时间不得不通过阅读该库的源码进行学习,我现在也准备这样做. 这是第一篇笔记,先从最基础的核心(Core)对象开始. Core::Vector2 该构造函数用来创建一个表示二维向量的对象 复制代码 代码如下: THREE.Vector2 = f

CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析_php实例

本文实例讲述了CI框架URI.php中_fetch_uri_string()函数用法.分享给大家供大家参考,具体如下: APPPATH/config/config.php中对于url 格式的拟定. $config['uri_protocol'] = 'AUTO'; 这个配置项目定义了你使用哪个服务器全局变量来拟定URL. 默认的设置是auto,会把下列四个方式轮询一遍.当你的链接不能工作的时候,试着用用auto外的选项. 'AUTO'            Default - auto dete