thinkphp3.2 运行流程

//1.入口文件   index.php
  
//首页入口文件

//检测PHP 环境

if (version_compare(PHP_VERSION, '5.3.0', '<')) die('require PHP > 5.3.0 !') ;

//是否开启调试模式

define('APP_DEBUG', true);

//定义应用目录

define('APP_PATH', './Application/');

//引入ThinkPHP框架

require './ThinkPHP/ThinkPHP.php';

 

// 2.ThinkPHP公共入口文件

// 记录开始运行时间

$GLOBALS['_beginTime'] = microtime(true);

// 记录内存初始使用
define('MEMORY_LIMIT_ON', function_exists('memory_get_usage'));

if (MEMORY_LIMIT_ON) {
    $GLOBALS['_startUseMems'] = memory_get_usage();
}

// 版本信息
const THINK_VERSION = '3.2.4';

// URL 模式定义
const URL_COMMON   = 0; //普通模式
const URL_PATHINFO = 1; //PATHINFO模式
const URL_REWRITE  = 2; //REWRITE模式
const URL_COMPAT   = 3; // 兼容模式




// 类文件后缀
const EXT = '.class.php';

// 系统常量定义
defined('THINK_PATH') or define('THINK_PATH', __DIR__ . '/');
defined('APP_PATH') or define('APP_PATH', dirname($_SERVER['SCRIPT_FILENAME']) . '/');

defined('APP_STATUS') or define('APP_STATUS', ''); // 应用状态 加载对应的配置文件
defined('APP_DEBUG') or define('APP_DEBUG', false); // 是否调试模式

if (function_exists('saeAutoLoader')) {
// 自动识别SAE环境
    defined('APP_MODE') or define('APP_MODE', 'sae');
    defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'Sae');
} else {
    defined('APP_MODE') or define('APP_MODE', 'common'); // 应用模式 默认为普通模式
    defined('STORAGE_TYPE') or define('STORAGE_TYPE', 'File'); // 存储类型 默认为File
}

// 系统运行时目录
defined('RUNTIME_PATH') or define('RUNTIME_PATH', APP_PATH . 'Runtime/');
// 系统核心类库目录
defined('LIB_PATH') or define('LIB_PATH', realpath(THINK_PATH . 'Library') . '/'); 
// Think类库目录
defined('CORE_PATH') or define('CORE_PATH', LIB_PATH . 'Think/'); 
// 行为类库目录
defined('BEHAVIOR_PATH') or define('BEHAVIOR_PATH', LIB_PATH . 'Behavior/'); 
// 系统应用模式目录
defined('MODE_PATH') or define('MODE_PATH', THINK_PATH . 'Mode/'); 
 // 第三方类库目录
defined('VENDOR_PATH') or define('VENDOR_PATH', LIB_PATH . 'Vendor/');
// 应用公共目录
defined('COMMON_PATH') or define('COMMON_PATH', APP_PATH . 'Common/'); 
// 应用配置目录
defined('CONF_PATH') or define('CONF_PATH', COMMON_PATH . 'Conf/');
// 应用语言目录 
defined('LANG_PATH') or define('LANG_PATH', COMMON_PATH . 'Lang/'); 
// 应用静态目录
defined('HTML_PATH') or define('HTML_PATH', APP_PATH . 'Html/'); 
// 应用日志目录
defined('LOG_PATH') or define('LOG_PATH', RUNTIME_PATH . 'Logs/'); 
// 应用缓存目录
defined('TEMP_PATH') or define('TEMP_PATH', RUNTIME_PATH . 'Temp/');
// 应用数据目录 
defined('DATA_PATH') or define('DATA_PATH', RUNTIME_PATH . 'Data/'); 
// 应用模板缓存目录
defined('CACHE_PATH') or define('CACHE_PATH', RUNTIME_PATH . 'Cache/'); 
// 配置文件后缀
defined('CONF_EXT') or define('CONF_EXT', '.php'); 
// 配置文件解析方法
defined('CONF_PARSE') or define('CONF_PARSE', ''); 

defined('ADDON_PATH') or define('ADDON_PATH', APP_PATH . 'Addon');


// 系统信息
if (version_compare(PHP_VERSION, '5.4.0', '<')) {
   
  //当遇到反斜杆(\)、单引号(')、双引号(")这样一些的字符定入到数据库里,又不想被过滤掉,使用
  //这个函数(magic_quotes_runtime),将会自动加上一个反斜杆(\),保护系统和数据库的安全。

   ini_set('magic_quotes_runtime', 0);

   define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc() ? true : false);
} else {
    define('MAGIC_QUOTES_GPC', false);
}


define('IS_CGI', (0 === strpos(PHP_SAPI, 'cgi') || false !== strpos(PHP_SAPI, 'fcgi')) ? 1 : 0);
define('IS_WIN', strstr(PHP_OS, 'WIN') ? 1 : 0);
define('IS_CLI', PHP_SAPI == 'cli' ? 1 : 0);

if (!IS_CLI) {
    // 当前文件名
    if (!defined('_PHP_FILE_')) {
        if (IS_CGI) {
            //CGI/FASTCGI模式下
            $_temp = explode('.php', $_SERVER['PHP_SELF']);
            define('_PHP_FILE_', rtrim(str_replace($_SERVER['HTTP_HOST'], '', $_temp[0] . '.php'), '/'));
        } else {
            define('_PHP_FILE_', rtrim($_SERVER['SCRIPT_NAME'], '/'));
        }
    }
    if (!defined('__ROOT__')) {
        $_root = rtrim(dirname(_PHP_FILE_), '/');
        define('__ROOT__', (('/' == $_root || '\\' == $_root) ? '' : $_root));
    }
}



// 加载核心Think类
require CORE_PATH . 'Think' . EXT;
// 应用初始化
Think\Think::start();


解析 :

get_magic_quotes_gpc()

返回值: 长整数

本函数取得 PHP 环境配置的变量 magic_quotes_gpc (GPC, Get/Post/Cookie) 值。返回 0 表示关闭本功能;返回 1 表示本功能打开。当 magic_quotes_gpc 打开时,所有的 ' (单引号), " (双引号), (反斜线) and 空字符会自动转为含有反斜线的溢出字符。



3.Think.class.php

 // 注册AUTOLOAD方法
 spl_autoload_register('Think\Think::autoload');
 // 设定错误和异常处理
 register_shutdown_function('Think\Think::fatalError');
 set_error_handler('Think\Think::appError');
 set_exception_handler('Think\Think::appException');
 // 初始化文件存储方式
 Storage::connect(STORAGE_TYPE);

// 如果有 $runtimefile 同时 开启 APP_DEBUG 

 if (!APP_DEBUG && Storage::has($runtimefile)) {
        Storage::load($runtimefile);
 }else{


        // 读取应用模式

        // 加载核心文件

        // 加载应用模式配置文件

        // 读取当前应用模式对应的配置文件

        // 加载应用别名定义文件

        // 加载模式行为定义

        // 加载应用行为定义

        // 加载框架底层语言包

    }

// 读取当前应用状态对应的配置文件

// 设置系统时区

// 检查应用目录结构 如果不存在则自动创建

// 记录加载文件时间

// 运行应用
4. App.class.php

    /**
     * 运行应用实例 入口文件使用的快捷方法
     * @access public
     * @return void
     */
    public static function run()
    {
        // 加载动态应用公共文件和配置
        load_ext_file(COMMON_PATH);
        // 应用初始化标签
        Hook::listen('app_init');
        App::init();
        // 应用开始标签
        Hook::listen('app_begin');
        // Session初始化
        if (!IS_CLI) {
            session(C('SESSION_OPTIONS'));
        }
        // 记录应用初始化时间
        G('initTime');
        App::exec();
        // 应用结束标签
        Hook::listen('app_end');
        return;
    }


run()方法:

    ①App::init();  

    load_ext_file加载应用的公共文件(./Application/Common/Common/)配置(./Application/Common/Conf)

    Think\Dispatcher::dispatch();  URL解析,获取控制器index、方法index

    ②App::exec(); 执行应用程序,及新建控制器HomeConstroller的实例,即对象;

    创建控制器实例:$module  =  controller(CONTROLLER_NAME,CONTROLLER_PATH); 即=new IndexController();

    利用php反射机制获取action方法对象,$method =   new \ReflectionMethod($module, $action);

    执行这个方法:$method->invoke($module); //无参数时执行,访问首页默认执行这个

            $method->invokeArgs($module,$args); //有参数时执行;

    以上即执行了控制器 ./Application/Home/Controller/IndexController.class.php 中的index方法

参考文档:https://www.cnblogs.com/gamir/p/4264930.html

                 https://www.cnblogs.com/Sunlight1992/p/4545174.html

 

你可能感兴趣的:(thinkphp)