search
HomeBackend DevelopmentPHP TutorialCI framework source code reading---------system initialization file_PHP tutorial

CI framework source code reading---------system initialization file_PHP tutorial

Jul 14, 2016 am 10:08 AM
analyzeinitializationimplementdocumentframeprocessSource codesystemread

CodeIgniter.php execution process analysis

This is the system initialization file
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
If not, directly load constants.php under APPPATH/cofig/
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
Load and instantiate the benchmark class (class file: core/Benchmark.php)
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
Details: http://codeigniter.org.cn/user_guide/general/hooks.html
11. Load and instantiate the configuration class
If we manually configure it through $assign_to_config[] in index.php
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
get_instance() This function is used to 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
First obtain the loaded classes and methods through the controller
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
Finally call the requested method
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.
The following is the file source code:
[php]
/** 
 * 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 */

www.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...
Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
How can you check if a PHP session has already started?How can you check if a PHP session has already started?Apr 30, 2025 am 12:20 AM

In PHP, you can use session_status() or session_id() to check whether the session has started. 1) Use the session_status() function. If PHP_SESSION_ACTIVE is returned, the session has been started. 2) Use the session_id() function, if a non-empty string is returned, the session has been started. Both methods can effectively check the session state, and choosing which method to use depends on the PHP version and personal preferences.

Describe a scenario where using sessions is essential in a web application.Describe a scenario where using sessions is essential in a web application.Apr 30, 2025 am 12:16 AM

Sessionsarevitalinwebapplications,especiallyfore-commerceplatforms.Theymaintainuserdataacrossrequests,crucialforshoppingcarts,authentication,andpersonalization.InFlask,sessionscanbeimplementedusingsimplecodetomanageuserloginsanddatapersistence.

How can you manage concurrent session access in PHP?How can you manage concurrent session access in PHP?Apr 30, 2025 am 12:11 AM

Managing concurrent session access in PHP can be done by the following methods: 1. Use the database to store session data, 2. Use Redis or Memcached, 3. Implement a session locking strategy. These methods help ensure data consistency and improve concurrency performance.

What are the limitations of using PHP sessions?What are the limitations of using PHP sessions?Apr 30, 2025 am 12:04 AM

PHPsessionshaveseverallimitations:1)Storageconstraintscanleadtoperformanceissues;2)Securityvulnerabilitieslikesessionfixationattacksexist;3)Scalabilityischallengingduetoserver-specificstorage;4)Sessionexpirationmanagementcanbeproblematic;5)Datapersis

Explain how load balancing affects session management and how to address it.Explain how load balancing affects session management and how to address it.Apr 29, 2025 am 12:42 AM

Load balancing affects session management, but can be resolved with session replication, session stickiness, and centralized session storage. 1. Session Replication Copy session data between servers. 2. Session stickiness directs user requests to the same server. 3. Centralized session storage uses independent servers such as Redis to store session data to ensure data sharing.

Explain the concept of session locking.Explain the concept of session locking.Apr 29, 2025 am 12:39 AM

Sessionlockingisatechniqueusedtoensureauser'ssessionremainsexclusivetooneuseratatime.Itiscrucialforpreventingdatacorruptionandsecuritybreachesinmulti-userapplications.Sessionlockingisimplementedusingserver-sidelockingmechanisms,suchasReentrantLockinJ

Are there any alternatives to PHP sessions?Are there any alternatives to PHP sessions?Apr 29, 2025 am 12:36 AM

Alternatives to PHP sessions include Cookies, Token-based Authentication, Database-based Sessions, and Redis/Memcached. 1.Cookies manage sessions by storing data on the client, which is simple but low in security. 2.Token-based Authentication uses tokens to verify users, which is highly secure but requires additional logic. 3.Database-basedSessions stores data in the database, which has good scalability but may affect performance. 4. Redis/Memcached uses distributed cache to improve performance and scalability, but requires additional matching

Define the term 'session hijacking' in the context of PHP.Define the term 'session hijacking' in the context of PHP.Apr 29, 2025 am 12:33 AM

Sessionhijacking refers to an attacker impersonating a user by obtaining the user's sessionID. Prevention methods include: 1) encrypting communication using HTTPS; 2) verifying the source of the sessionID; 3) using a secure sessionID generation algorithm; 4) regularly updating the sessionID.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment