CI源码分析-index.php文件

最近PHP和NodeJS都有点深入不下去了。所以找个源码看看

选来选去选了CI框架,版本是3.1.4,为什么要选这个版本呢,主要是博主之前用CI的时候就是CI3,这个版本也算是熟悉了吧

源码的tab对齐看的很蛋疼,强迫症不能忍啊

略微改了排版,原版代码写得太长了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
<?php
// 定义运行环境
define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ?
$_SERVER['CI_ENV'] : 'development');
// 根据运行环境切换错误报告
switch (ENVIRONMENT)
{
case 'development': // 开发环境,打开所有提示
error_reporting(-1);
ini_set('display_errors', 1);
break;
case 'testing':// 生产环境,关闭所有提示
case 'production':
ini_set('display_errors', 0);
// PHP5.3之后新增了一些错误类型
if (version_compare(PHP_VERSION, '5.3', '>='))
{
error_reporting(E_ALL & ~E_NOTICE & ~E_DEPRECATED
& ~E_STRICT & ~E_USER_NOTICE & ~E_USER_DEPRECATED);
}
else
{
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT
& ~E_USER_NOTICE);
}
break;
default: // 如果环境类型不在上面的分类中,服务器发送503响应,并提示错误
header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);
echo 'The application environment is not set correctly.';
exit(1); // EXIT_ERROR
}
// 定义CI文件目录
$system_path = 'system';
// 定义应用目录
$application_folder = 'application';
/**
* 如果视图文件不在应用目录内,设置这个变量可以切换目录
*/
$view_folder = '';
// 设置CI的默认控制器,这个地方不做深究
// 在coonfig/routes.php有一个类似简化的设置
// 控制器目录
// $routing['directory'] = '';
// 控制器名字
// $routing['controller'] = '';
// 调用的方法
// $routing['function'] = '';
// 如果CI以命令行模式运行
// 则把php当前目录切换到此文件所在目录
if (defined('STDIN'))
{
chdir(dirname(__FILE__));
}
if (($_temp = realpath($system_path)) !== FALSE)
{
/**
* 如果CI文件目录存在,将它修改为绝对路径
*/
$system_path = $_temp.DIRECTORY_SEPARATOR;
}
else
{
/**
* 如果CI目录不存在,也就是说,可能是分隔符写错了
*/
$system_path = strtr(
rtrim($system_path, '/\\'),
'/\\',
DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR
).DIRECTORY_SEPARATOR;
}
/**
* 如果经历了上面的步骤,还是找不到CI文件的目录
*/
if ( ! is_dir($system_path))
{ // 发送503响应,并且提示错误
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
}
// 保存自身文件名到SELF。通常为index.php
// 这里有些不明白,可能是博主的PHP修养不够
// 为什么这里使用pathinfo来获取文件名,而后面却用basename
// 这两种方法返回值应该是相同的才对
define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));
// 保存CI文件目录到BASEPATH
define('BASEPATH', $system_path);
// 保存front controller,也就是这个文件的路径
define('FCPATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
// 保存CI目录的名字 通常为system
define('SYSDIR', basename(BASEPATH));
// 这一部分和对CI目录的解析是相同的
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); // EXIT_CONFIG
}
// 保存应用目录
define('APPPATH', $application_folder.DIRECTORY_SEPARATOR);
// 设置视图目录。这里的检测方法很值得学习
// 他没有使用empty或者strlen来做检测
// 因为strlen和empty在没有view_folder这个变量的时候会报错
// isset来解决这个问题显得更加的合乎情理
if (!isset($view_folder[0]) && is_dir(APPPATH.'views'.DIRECTORY_SEPARATOR))
{
// 如果没有设置view_folder,默认视图位置就在应用目录的views下
$view_folder = APPPATH.'views';
}
elseif (is_dir($view_folder))
{
// 如果用户设置了view_folder
// 下面的内容和上面设置CI目录、应用目录是一样的
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); // EXIT_CONFIG
}
// 保存视图目录
define('VIEWPATH', $view_folder.DIRECTORY_SEPARATOR);
// 加载CI启动文件
require_once BASEPATH.'core/CodeIgniter.php';