1. Define CI version
2. Define CI branches Here I think CI has two branches, one is Core and the other is Reactor. But I haven't figured out the specific function here yet.
3. Load the global function system/core/common.php
4. Load framework constants If ENVIRONMENT constants are defined and there is a folder named ENVIRONMENT constants under APPPATH/cofig/ and constants.php exists in it, load this constants.php
5. Define a custom error handling function for us to record PHP error logs
6. If the current php version >5.3, turn off magic escaping
7. Set the class prefix (you can customize the configuration items through $assign_to_config[] in index.php)
The general class prefix will be set in the config file. This class prefix allows CI to know which classes in the libraries folder under the application inherit the CI core class, because CI allows overwriting in the entry file index.php Configuration items of the configuration file, so we need to know whether the class prefix is overridden before the program starts executing. If it is overridden, we will set its value before all classes are loaded.
8. Set script execution time
9. The script starts executing
Make note of the two time points total_execution_time_start and loading_time:_base_classes_start
10. If the hook class (class file core/Hooks.php) can be loaded and instantiated, we will load and instantiate it
This requires that the hook is enabled in application/config/config.php and the current hook is defined in the application/config/hooks.php file
11. Load and instantiate the configuration class
12. Load and instantiate the UTF-8 class. The order here is very important. The UTF-8 class must be loaded after the configuration class
13. Load and instantiate URI class
14. Load and instantiate the router class, and set the router
15. Load and instantiate the output class
16. Determine whether there is a cached file and if there is output
17. To prevent xss and csrf attacks, load and instantiate the security class
18. Load and instantiate the input class
19. Load and instantiate the language package
20. Load and instantiate the controller class
21. Determine whether there is a sub-controller class and load it if it exists
22. Use the controller to load the controller requested under the local application
23. Record loading_time:_base_classes_end time point
24. Conduct security monitoring. Here is a description: All functions, whether application controllers or loaded classes, can be called through URI. Controller functions cannot start with an underscore
When the loaded class or method is not in the CI_Controller class, a 404 page is displayed
25. If the pre_controller hook is set, call
26. Record the time when the controller is requested and instantiate the requested class
27. If the post_controller_constructor hook is set, call
28. Call the request method
First check whether there is a _remap method in the requested class, and if it is called
If it is not determined whether there is a requested method in the requested class, if the 404 page is not displayed
29. Record the time when the controller execution ends
30. If the post_controller hook is set, call
31. Send the final output to the browser
32. If the post_system hook is set, call
33. Determine whether the CI_DB class exists and whether $CI->db has a value set. If it is true, close the database connection.
/**
* CodeIgniter
*
* An open source application development framework for PHP 5.1.6 or newer
*
* @package CodeIgniter
* @author ExpressionEngine Dev Team
* @copyright Copyright (c) 2008 - 2011, EllisLab, Inc.
* @license http://codeigniter.com/user_guide/license.html
* @link http://codeigniter.com
* @since Version 1.0
* @filesource
*/
// ------------------------------------------------------------------------
/**
* System Initialization File
*
* Loads the base classes and executes 执行 the request.
*
* @package CodeIgniter
* @subpackage codeigniter
* @category Front-controller
* @author ExpressionEngine Dev Team
* @link http://codeigniter.com/user_guide/
*/
/**
* CodeIgniter Version
*
* @var string
*
*/
define('CI_VERSION', '2.1.3');
/**
* CodeIgniter Branch (Core = TRUE, Reactor = FALSE)
*
* @var boolean
*
*/
define('CI_CORE', FALSE);
/*
* ------------------------------------------------------
* Load the global functions
* ------------------------------------------------------
*/
require(BASEPATH.'core/Common.php');
/*
* ------------------------------------------------------
* Load the framework constants
* ------------------------------------------------------
*/
if (defined('ENVIRONMENT') AND file_exists(APPPATH.'config/'.ENVIRONMENT.'/constants.php'))
{
require(APPPATH.'config/'.ENVIRONMENT.'/constants.php');
}
else
{
require(APPPATH.'config/constants.php');
}
/*
* ------------------------------------------------------
* Define a custom 自定义 error handler 处理器 so we can log PHP errors
* ------------------------------------------------------
*/
set_error_handler('_exception_handler');
if ( ! is_php('5.3'))
{
@set_magic_quotes_runtime(0); // Kill magic quotes 关闭魔术转义
}
/*
* ------------------------------------------------------
* Set the subclass_prefix 类前缀
* ------------------------------------------------------
*
* Normally the "subclass_prefix" is set in the config file.
* The subclass prefix allows CI to know if a core class is
* being extended via 通过 a library in the local application
* "libraries" folder. Since 因为 CI allows config items to be
* overriden via data set in the main index. php file,
* before proceeding 开始 、程序 we need to know if a subclass_prefix
* override exists. 存在 If so, we will set this value now,
* before any 任何 classes are loaded
* Note: Since the config file data is cached it doesn't
* hurt 伤害,使受伤 to load it here.
* 注意:因为配置文件的数据已经被缓存,所以它加载到这里也不会有伤害。
*/
if (isset($assign_to_config['subclass_prefix']) AND $assign_to_config['subclass_prefix'] != '')
{
get_config(array('subclass_prefix' => $assign_to_config['subclass_prefix']));
}
/*
* ------------------------------------------------------
* Set a liberal 自由主义者 script execution 执行 time limit
* ------------------------------------------------------
*/
if (function_exists("set_time_limit") == TRUE AND @ini_get("safe_mode") == 0)
{
@set_time_limit(300);
}
/*
* ------------------------------------------------------
* Start the timer... tick tock tick tock...
* ------------------------------------------------------
*/
$BM =& load_class('Benchmark', 'core');
$BM->mark('total_execution_time_start');
$BM->mark('loading_time:_base_classes_start');
/*
* ------------------------------------------------------
* Instantiate the hooks class
* ------------------------------------------------------
*/
$EXT =& load_class('Hooks', 'core');
/*
* ------------------------------------------------------
* Is there a "pre_system" hook?
* ------------------------------------------------------
*/
$EXT->_call_hook('pre_system');
/*
* ------------------------------------------------------
* Instantiate the config class
* ------------------------------------------------------
*/
$CFG =& load_class('Config', 'core');
// Do we have any manually 手动的 set config items in the index.php file?
if (isset($assign_to_config))
{
$CFG->_assign_to_config($assign_to_config);
}
/*
* ------------------------------------------------------
* Instantiate the UTF-8 class
* ------------------------------------------------------
*
* Note: Order 命令顺序 here is rather 宁可,当然 important as the UTF-8
* class needs to be used very early 早期的,提早 on, but it cannot
* properly 适当的、正确的 determine 决定 if UTf-8 can be supported until 在。。。以前
* after the Config class is instantiated.
*
*/
$UNI =& load_class('Utf8', 'core');
/*
* ------------------------------------------------------
* Instantiate the URI class
* ------------------------------------------------------
*/
$URI =& load_class('URI', 'core');
/*
* ------------------------------------------------------
* Instantiate the routing class and set the routing
* ------------------------------------------------------
*/
$RTR =& load_class('Router', 'core');
$RTR->_set_routing();
// Set any routing overrides that may exist in the main index file
if (isset($routing))
{
$RTR->_set_overrides($routing);
}
/*
* ------------------------------------------------------
* Instantiate the output class
* ------------------------------------------------------
*/
$OUT =& load_class('Output', 'core');
/*
* ------------------------------------------------------
* Is there a valid 有效的 cache file? If so, we're done...
* ------------------------------------------------------
*/
if ($EXT->_call_hook('cache_override') === FALSE)
{
if ($OUT->_display_cache($CFG, $URI) == TRUE)
{
exit;
}
}
/*
* -----------------------------------------------------
* Load the security 安全 class for xss and csrf support
* -----------------------------------------------------
*/
$SEC =& load_class('Security', 'core');
/*
* ------------------------------------------------------
* Load the Input class and sanitize 使。。。无害 globals
* ------------------------------------------------------
*/
$IN =& load_class('Input', 'core');
/*
* ------------------------------------------------------
* Load the Language class
* ------------------------------------------------------
*/
$LANG =& load_class('Lang', 'core');
/*
* ------------------------------------------------------
* Load the app controller and local controller
* ------------------------------------------------------
*
*/
// Load the base controller class
require BASEPATH.'core/Controller.php';
function &get_instance()
{
return CI_Controller::get_instance();
}
if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php'))
{
require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller.php';
}
// Load the local application controller
// Note: The Router class automatically 不经思索的、自动的 validates 确认 the controller
// path using the router->_validate_request().
// If this include fails it means 手段、意思是 that 因为、那么 the default controller in
// the Routes.php fi.le is not resolving 解析 to something 非常 valid 有效地
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');
// Set a mark point for benchmarking 管理标记
$BM->mark('loading_time:_base_classes_end');
/*
* ------------------------------------------------------
* Security check
* ------------------------------------------------------
*
* None of the functions in the app controller or the
* loader class can be called via the URI, nor 也不是、也没有 can
* controller functions that begin with an underscore 下划线、强调、底线
* All functions, whether application controllers or loaded classes, can be called through URI. Controller functions cannot start with an underscore
*/
$class = $RTR->fetch_class();
$method = $RTR->fetch_method();
if ( ! class_exists($class)
OR strncmp($method, '_', 1) == 0
OR in_array(strtolower($method), array_map('strtolower', get_class_methods('CI_Controller')))
) )
{
if ( ! emptyempty($RTR->routes['404_override']))
{
$x = explode('/', $RTR->routes['404_override']);
$class = $x[0];
$method = (isset($x[1]) ? $x[1] : 'index');
if ( ! class_exists($class))
if ( ! file_exists(APPPATH.'controllers/'.$class.'.php'))
show_404("{$class}/{$method}");
}
include_once(APPPATH.'controllers/'.$class.'.php');
}
} }
else
{
show_404("{$class}/{$method}");
} }
}
/*
*------------------------------------------------ --------
* Is there a "pre_controller" hook?
*------------------------------------------------ --------
*/
$EXT->_call_hook('pre_controller');
/*
*------------------------------------------------ --------
* Instantiate the requested controller
*------------------------------------------------ --------
*/
// Mark a start point so we can benchmark the controller
$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start');
$CI = new $class();
/*
*------------------------------------------------ --------
* Is there a "post_controller_constructor" hook?
*------------------------------------------------ --------
*/
$EXT->_call_hook('post_controller_constructor');
/*
*------------------------------------------------ --------
* Call the requested method
*------------------------------------------------ --------
*/
// Is there a "remap" function? If so, we call it instead replace, replace
if (method_exists($CI, '_remap'))
{
$CI->_remap($method, array_slice($URI->rsegments, 2));
}
else
{
// is_callable() returns TRUE on some versions of PHP 5 for private and protected
// methods, so we'll use this workaround for consistent behavior consistent behavior
if ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($CI))))
{
// Check and see if we are using a 404 override and use it.
if ( ! emptyempty($RTR->routes['404_override']))
{
$x = explode('/', $RTR->routes['404_override']);
$class = $x[0];
$method = (isset($x[1]) ? $x[1] : 'index');
if ( ! class_exists($class))
{
if ( ! file_exists(APPPATH.'controllers/'.$class.'.php'))
{
show_404("{$class}/{$method}");
}
include_once(APPPATH.'controllers/'.$class.'.php');
unset($CI);
$CI = new $class();
}
}
else
{
show_404("{$class}/{$method}");
}
}
// Call the requested method.
// Any URI segments 片段 present 礼物、现在、目前 (besides 除了。。。之外 the class/function)
// will be passed to the method for convenience 便利、方便
call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));
}
// Mark a benchmark end point
$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end');
/*
* ------------------------------------------------------
* Is there a "post_controller" hook?
* ------------------------------------------------------
*/
$EXT->_call_hook('post_controller');
/*
* ------------------------------------------------------
* Send the final rendered 提出、已渲染的 output to the browser
* ------------------------------------------------------
*/
if ($EXT->_call_hook('display_override') === FALSE)
{
$OUT->_display();
}
/*
* ------------------------------------------------------
* Is there a "post_system" hook?
* ------------------------------------------------------
*/ www.2cto.com
$EXT->_call_hook('post_system');
/*
* ------------------------------------------------------
* Close the DB connection if one exists
* ------------------------------------------------------
*/
if (class_exists('CI_DB') AND isset($CI->db))
{
$CI->db->close();
}
/* End of file CodeIgniter.php */
/* Location: ./system/core/CodeIgniter.php */
http://www.bkjia.com/PHPjc/477757.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/477757.htmlTechArticleCodeIgniter.php Execution process analysis This is the system initialization file 1. Define CI version 2. Define CI branch Here I think CI has two branches, one is Core and the other is Reactor. But here...