• ThinkPHP3.0启动过程


    以Blog举例
    载入项目入口文件
        D:wampwwwExamplesBlogindex.php
            定义常量
            APP_NAME,Blog
            APP_PATH,D:wampwwwExamplesBlog (APP_PATH为项目核心框架结构文件(lib)所在目录)
    载入ThinkPHP框架入口文件
        D:wampwwwThinkPHPThinkPHP.php
            记录开始运行时间,记录内存使用情况
            检查项目是否定义常量APP_PATH,(如果没有定义为目录D:wampwwwThinkPHP)
            根据APP_PATH定义常量RUNTIME_PATH,D:wampwwwExamplesBlogRuntime
            检查项目是否定义常量APP_DEBUG,false (如果没有定义为false)
            检查项目是否定义常量MODE_NAME,~runtime.php (如果没有定义为~runtime.php)
            定义常量RUNTIME_FILE,D:wampwwwExamplesBlogRuntime~runtime.php
            如果非调试并存在RUNTIME_FILE,直接加载D:wampwwwExamplesBlogRuntime~runtime.php
            如果现在还没有这个文件
            定义常量THINK_PATH,D:wampwwwThinkPHPThinkPHP
    加载运行时文件
        D:wampwwwThinkPHPThinkPHPCommon untime.php
            检查是否定义常量THINK_PATH,没定义就终止程序
            检查PHP版本,如果小于5.2.0终止程序执行
            定义常量THINK_VERSION,3.0
            定义常量THINK_RELEASE,20120323
            根据PHP版本设置魔术引号
            定义常量MAGIC_QUOTES_GPC,False
            定义常量IS_CGI,0
            定义常量IS_WIN,1
            定义常量IS_CLI,0
            检查是否定义APP_NAME
            PHP非CLI模式下
                定义常量_PHP_FILE_,/Examples/Blog/index.php
                定义常量__ROOT__,/Examples
                定义常量URL_COMMON,      0
                定义常量URL_PATHINFO,    1
                定义常量URL_REWRITE,     2
                定义常量URL_COMPAT,      3
            路径设置 可在项目或者THINKPHP入口文件中重新定义 所有路径常量都必须以/ 结尾
            定义常量CORE_PATH,   D:wampwwwThinkPHP/Lib/
            定义常量EXTEND_PATH, D:wampwwwThinkPHP/Extend/
            定义常量MODE_PATH,   D:wampwwwThinkPHP/Extend/Mode/
            定义常量ENGINE_PATH, D:wampwwwThinkPHP/Extend/Engine/
            定义常量VENDOR_PATH, D:wampwwwThinkPHP/Extend/Vendor/
            定义常量LIBRARY_PATH,D:wampwwwThinkPHP/Extend/Library/
            定义常量COMMON_PATH, D:wampwwwExamplesBlogCommon/
            定义常量LIB_PATH,    D:wampwwwExamplesBlogLib/
            定义常量CONF_PATH,   D:wampwwwExamplesBlogConf/
            定义常量LANG_PATH,   D:wampwwwExamplesBlogLang/
            定义常量TMPL_PATH,   D:wampwwwExamplesBlogTpl/
            定义常量HTML_PATH,   D:wampwwwExamplesBlogHtml/
            定义常量LOG_PATH,    D:wampwwwExamplesBlogRuntime/Logs/
            定义常量TEMP_PATH,   D:wampwwwExamplesBlogRuntime/Temp/
            定义常量DATA_PATH,   D:wampwwwExamplesBlogRuntime/Data/
            定义常量CACHE_PATH,  D:wampwwwExamplesBlogRuntime/Cache/
            设置VENDOR_PATH目录到include_path
            定义初始化方法,build_app_dir,build_first_action,build_runtime_cache,build_tags_cache,check_runtime,load_runtime_file
            调用load_runtime_file方法
                加载基础函数文件common.php,D:wampwwwThinkPHPCommon/common.php
                加载核心编译文件
                D:wampwwwThinkPHP/Lib/Core/Think.class.php
                D:wampwwwThinkPHP/Lib/Core/ThinkException.class.php
                D:wampwwwThinkPHP/Lib/Core/Behavior.class.php
                把别名配置文件导入别名静态变量$_alias,别名配置文件为D:wampwwwThinkPHPConf/alias.php
                如果目录D:wampwwwExamplesBlogLib/不存在,创建默认项目文件结构及config.php和IndexAction.class.php文件
                如果存在就检查项目的缓存目录D:wampwwwExamplesBlogRuntime/Cache/。不存在就创建默认文件结构。
                如果是调试模式,删除RUNTIME_FILE定义的文件
            记录加载文件时间
            执行Think::Start()
    该方法在核心文件D:wampwwwThinkPHP/Lib/Core/Think.class.php类里
        设定错误和异常处理,appError,appException
        注册AUTOLOAD方法,autoload
        执行Think::builApp方法
            把惯例配置文件导入配置静态变量$_config,惯例配置文件为D:wampwwwThinkPHPConf/convention.php
            如果定义常量MODE_NAME,则到D:wampwwwThinkPHP/Extend/Mode/目录下导入对应的模式配置文件到变量$mode
            如果模式配置配置文件有config项,就导入到配置静态变量$_config
            把项目配置配置文件D:wampwwwExamplesBlogConf/config.php导入配置静态变量$_config
            加载顶层语言包D:wampwwwThinkPHPLangzh-cn.php到语言静态变量$_lang
            系统行为定义如下:
            如果静态配置变量中有APP_TAGS_ON,并且为true,加载变量$mode的extends项到配置静态变量$_config的extends下,变量$mode没有extends项,
            把系统配置下的tags.php导入到配置静态变量$_config的extends下,D:wampwwwThinkPHPConf/tags.php
            项目行为定义如下:
            加载变量$mode的extends项到配置静态变量$_config的tags下,变量$mode没有tags项,
            把项目配置下的tags.php导入到配置静态变量$_config的tags下,D:wampwwwExamplesBlogConf/tags.php
            读取核心编译文件如下:
            如果变量$mode定义core,核心文件为该项,如果没有定义,核心文件则为
            D:wampwwwThinkPHPCommon/functions.php
            D:wampwwwThinkPHP/Lib/Core/Log.class.php
            D:wampwwwThinkPHP/Lib/Core/Dispatcher.class.php
            D:wampwwwThinkPHP/Lib/Core/App.class.php
            D:wampwwwThinkPHP/Lib/Core/Action.class.php
            D:wampwwwThinkPHP/Lib/Core/View.class.php
            把项目核心配置定义D:wampwwwExamplesBlogConf/core.php的数组及以上文件保存到变量$list
            依次加载核心文件
            非调试模式时把这些核心文件写入变量$compile
            加载项目公共文件D:wampwwwExamplesBlogCommon/common.php
            非调试模式时把项目公共文件写入变量$compile
            把变量$mode的alias项导入别名静态变量$_alias
            非调试模式时把变量$mode的alias项写入变量$compile
            把项目别名文件导入别名静态变量$_alias,D:wampwwwExamplesBlogConf/alias.php
            非调试模式时把项目别名文件的alias项写入变量$compile
            如果是调试环境,
                把系统调试配置文件导入配置静态变量$_config,D:wampwwwThinkPHPThinkPHPConf/debug.php
                取出APP_STATUS配置,加载项目配置调试配置文件 D:wampwwwExamplesBlogConf/$status.php
            如果非调试模式,调用build_runtime_cache函数生成编译文件
                基本上将语言包,配置,别名,核心函数,defined变量,D:wampwwwThinkPHP/Lib/Behavior/里的由extends定义的类,生成一个文件~runtime.php
        执行APP::run方法
            根据extends和tags记录的app_init项,实例化行为
            设置时区
            如果配置静态变量$_config有LOAD_EXT_FILE项,则动态在D:wampwwwExamplesBlogCommon/目录下加载文件
            如果配置静态变量$_config有LOAD_EXT_CONFIG项,则动态在D:wampwwwExamplesBlogConf/目录下加载文件到静态变量$_config
            执行Dispatcher::dispatch方法
                这里代码太多~~~不好理解
            如果定了分组,根据分组加载配置和函数
            定义模板相关常量
            根据extends和tags记录的app_begin项,实例化行为
            根据配置静态变量$_config的SESSION_OPTIONS项session初始化
                根据SESSION_TYPE到D:wampwwwThinkPHP/Extend/DriverSession/目录下加载对应的类并实例化,执行实例的execute方法
            记录应用初始化时间
            执行mvc流程,
                涉及__hack_module方法和Empty模块
                执行action_name行为
                执行该模块对应动作的_before_action方法
                执行模块对应动作
                执行该模块对应动作的_after_action方法
            根据extends和tags记录的app_end项,实例化行为
            保存日志记录

    附录:
        自动加载
            先从别名静态配置变量$_alias里查找,如果有直接加载
            如果是Behavior类,从D:wampwwwThinkPHP/Lib/Behavior/目录,D:wampwwwThinkPHP/Extend/Behavior/目录,D:wampwwwExamplesBlogLib/Behavior/,模式目录的/Behavior/目录查找
            如果是Model类,从D:wampwwwExamplesBlogLib/Model/目录,D:wampwwwThinkPHP/Extend/Model/目录查找
            如果是Action类,从D:wampwwwExamplesBlogLib/Action/目录,D:wampwwwThinkPHP/Extend/Action/目录查找
            根据配置静态变量$_config的APP_AUTOLAOD_PATH项自动加载
        配置文件顺序
            系统别名 alias.php
            系统惯例 convention.php
            系统模式配置文件 例如cli.php
            项目配置文件 config.php
            语言包文件 zh-cn.php
            系统行为文件 tags.php
            项目行为文件 tags.php
            项目核心配置 core.php
            项目别名 alias.php
            系统调试配置文件 debug.php
            项目调试配置,$status.php

  • 相关阅读:
    RTSP/RTMP/GB28181协议视频监控平台搭建之国网B接口协议介绍
    如何判断视频流媒体播放器EasyPlayerRTSPWin的磁盘空间是否满足剩余的要求?
    H.265编码全面应用于TSINGSEE青犀视频全产品链,让视频更清晰!
    视频流媒体播放器EasyPlayerRTSP原始录像文件被新录像文件覆盖是什么原因?
    RTSP/RTMP/GB28181协议TSINGSEE青犀视频云服务搭建H265开发环境无法启动是什么原因?
    H265流媒体播放器EasyPlayer.JS在web开发项目中引用报“webAssembly instantiate”错误解决方案
    使用Opengl实现天空盒
    手机探索者开发实录—数据打包
    游戏开发中的设计模式之一-Strategy模式
    手机探索者开发实录—rndis/usbnet
  • 原文地址:https://www.cnblogs.com/meetrice/p/4114640.html
Copyright © 2020-2023  润新知