熟悉CI的朋友应该都记得这个应用程序流程图吧,当接收到一个http请求时,由index.php初始化运行CodeIgniter所需的资源,Routing检查请求确定如何处理,如果存在缓存就直接输出,若不存在缓存,对用户提交的数据进行安全检查,检查通过,加载对应控制器,控制器加载模型,类库等处理请求所需的资源,处理完成之后,将渲染的视图传给浏览器,如果有开启缓存,则将视图缓存。至此,整套流程就走完了。
那么index.php作为这套流程的入口,具体做了哪些事情?
1. 设置应用运行环境常量
//定义运行环境的全局常量,默认是开发环境,框架可以根据这个全局常量加载不同环境的文件和报错级别
define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
2.设置报错级别
switch (ENVIRONMENT)
{
//开发环境,打开错误提示,提示所有错误类型
case 'development':
error_reporting(-1);
ini_set('display_errors', 1);
break;
//测试环境和生产环境,关闭错误提示
case 'testing':
case 'production':
ini_set('display_errors', 0);
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;
//配置了不能识别的环境常量,错误代码503提示错误信息
default:
header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);
echo 'The application environment is not set correctly.';
exit(1); // EXIT_ERROR
}
3.设置系统目录常量
//系统目录
$system_path = 'system';
/*
*将系统目录转化为绝对路径
*/
if (defined('STDIN'))
{
chdir(dirname(__FILE__));
}
//如果$system_path已经是绝对路径,在路径最后加上目录分隔符'/'
if (($_temp = realpath($system_path)) !== FALSE)
{
$system_path = $_temp.DIRECTORY_SEPARATOR;
}
else
{
//根据$system_path变量,将其转化成绝对路径
$system_path = strtr(
rtrim($system_path, '/\\'),'/\\',
DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR
).DIRECTORY_SEPARATOR;
}
//若转化后的绝对路径不是目录,错误代码503
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
}
//定义当前文件名称的全局常量(此处常量值为index.php)
define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));
//定义入口文件绝对路径全局常量(常量值为index.php绝对路径)
define('FCPATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
//系统目录绝对路径全局常量
define('BASEPATH', $system_path);
//系统目录名称
define('SYSDIR', basename(BASEPATH));
4.设置应用目录常量
//应用目录名称
$application_folder = 'application';
//如果$application_folder是目录,且存在
if (is_dir($application_folder))
{
//如果$application_folder已经是绝对路径,在路径最后加上目录分隔符'/'
if (($_temp = realpath($application_folder)) !== FALSE)
{
$application_folder = $_temp;
}
else
{
//根据$application_folder变量,将其转化成绝对路径
$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
{
//若无法转化成绝对路径,错误代码503
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);
5.设置视图路径常量
//视图目录名称
$view_folder = '';
//如果$view_folder已设置、是目录,且存在
if ( ! isset($view_folder[0])&& is_dir(APPPATH.'views'.DIRECTORY_SEPARATOR))
{
$view_folder = APPPATH.'views';
}
elseif (is_dir($view_folder))
{
//如果$view_folder已经是绝对路径,在路径最后加上目录分隔符'/'
if (($_temp = realpath($view_folder)) !== FALSE)
{
$view_folder = $_temp;
}
//根据$view_folder变量,将其转化成绝对路径
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);
5.加载核心控制文件
/*
*入口文件最后加载了CodeIgniter.php
*CodeIgniter.php是ci框架的核心文件
*至此index.php的工作就完成了
*/
require_once BASEPATH.'core/CodeIgniter.php';