博客列表 >TP3.23源码解析执行流程

TP3.23源码解析执行流程

力挽狂澜的博客
力挽狂澜的博客原创
2018年05月09日 11:26:022060浏览

 1.入口文件index.php(最主要是定义系统常量)

检测PHP环境

开关调试模式,常量形式

定义项目名,是为了将入口文件从项目应用目录下拿出来,放到同级的位置

定义项目根目录

定义项目应用目录

定义公共模块目录

定义运行时目录

定义自定义常量,也可以用业务逻辑静态类来管理自定义常量

引入THINKPHP入口文件


2.ThinkPHP.php

记录开始运行时间

记录内存初始使用

版本信息    URL 模式定义    类文件后缀    系统常量定义    [第一:const定义常量,初始化的时候值就是标量,代码一次性写好,就不会再变了;define定义常量,初始化的时候值可以是变量,变量可能依赖于初始化的环境.第二:const可以作为普通常量或者类常量来声明且不能使用在逻辑分支里,define可以在逻辑分支中使用.第三:const作为类常量时作用域限制在类中,define定义的常量在定义代码后是全局的而不用管在哪里定义]

PHP_SAPI = apache2handler || cgi || fcgi || cli

__DIR__当前调用代码文件所在物理目录

$_SERVER['SCRIPT_FILENAME']    入口脚本物理路径

定义入口文件    _PHP_FILE_

定义入口文件所在根目录    __ROOT__

加载核心Think类    __ROOT__."ThinkPHP/Library/Think.class.php"


3.Think.class.php

命名空间    Think    [命名空间是为了解决同名变量,常量,方法,类调用冲突的问题,最常用是解决自动加载类下产生的同名类问题,其实质类似于在调用的类中声明时使用飞雷神标记,在想找到被标记的类时,使用飞雷神追踪] 命名空间的调用方式  $obj = 命名空间名称\类名()


spl_autoload_register('Think\Think::autoload'); 注册自定义自动加载类[spl = Standard PHP LibraryPHP标准类库]


register_shutdown_function('Think\Think::fatalError'); 在脚本执行结束或者调用exit()之后 注册一个被执行的回调


set_error_handler('Think\Think::appError'); 注册自定义错误处理回调.本函数可以用你自己定义的方式来处理运行中的错误, 例如,在应用程序中严重错误发生时,或者在特定条件下触发了一个错误(使用 trigger_error()),你需要对数据/文件做清理回收


set_exception_handler('Think\Think::appException'); 设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。 在 exception_handler 调用后异常会中止

 

Storage::connect(STORAGE_TYPE); 初始化文件存储方式

当debug模式关闭且运行时缓存文件$runtimefile = RUNTIME_PATH.APP_MODE.'~runtime.php'存在时,直接加载缓存;Storage::load($runtimefile);否则删除缓存;


判断 App/Common/Conf/core.php文件是否存在,来确定读取应用的模式.自己未定义的话则使用webroot/ThinkPHP/Mode/common.php文件,里面是一个数组配置,定义了配置文件,别名定义,函数和类文件,行为扩展定义配置;


读取应用模式配置中的函数文件和类文件,进行加载和编译

加载逻辑,首先在APP目录下的/Common/Conf/core.php文件是否存在[自定义配置],没有则使用ThinkPHP/Mode/common.php[框架本身的配置]

加载顺序:

框架函数库    ThinkPHP/Common/functions.php

    C    获取和设置配置参数

    load_config    加载配置文件

    E    抛出异常

    G    统计区间代码的运行时间和内存占用

    L    获取和设置语言定义

    trace    添加和获取页面Trace记录【】 

    compile    编译文件【】

    T    获取模版文件 格式 资源://模块@主题/控制器/操作【】

    I     获取输入参数 支持过滤和默认值

    N    设置和获取统计数据

    array_map_recursive    对数组成员递归使用函数处理

    parse_name  字符串命名风格转换【C风格是将_加字母解析成大写字母,java风格是将大写字母解析为_加小写字母】

    require_cache   自定义实现的require_once

    file_exists_case    区分大小写的文件存在判断

    import    导入所需的类库 同java的Import 本函数有缓存功能 内部包含了require_cache

    load    基于命名空间方式导入函数库

    vendor    快速导入第三方框架类库 所有第三方框架的类库文件统一放到 系统的Vendor目录下面

    D    实例化模型类 格式 [资源://][模块/]模型

    M    实例化一个没有模型文件的Model(Think\Model)

    parse_res_name    解析资源地址并导入类库文件(资源地址 格式:[扩展://][模块/]资源名)

    controller    用于实例化访问控制器

    A    实例化多层控制器 格式:[资源://][模块/]控制器(自动缓存控制器对象)

    R    远程调用控制器的操作方法 URL 参数格式 [资源://][模块/]控制器/操作(封装调用了A方法的逻辑)

    tag    处理标签扩展(\Think\Hook::listen($tag,$params);)

    B    执行某个行为(\Think\Hook::exec($name,$tag,$params);)

    strip_whitespace    去除代码中的空白和注释

    throw_exception    自定义异常处理(包含了Think\Log::record和Think\Think::halt)

    dump    对输出流字符串格式做了一些处理

    layout    设置当前页面的布局

    U    URL组装 支持不同URL模式.按照代码规则把输入参数解析成匹配模式的URL.如果要全局统一URL风格且会有切换的需求用这个,如果风格固定且知道,不如自己直接组装[]

    W    内部调用R,指定了第三个参数而已

    is_ssl    判断是否ssl协议

    redirect    利用header函数重定向到URL地址

    S    缓存管理

    F    快速文件数据读取和保存 针对简单类型数据 字符串、数组

    to_guid_string    根据PHP各种类型变量生成唯一标识号

    xml_encode    


    session    session管理

    cookie    cookie管理

    load_ext_file   加载PHP类库,include

    get_client_ip    获取客户端IP地址

    send_http_status    发送HTTP状态,使用了header函数

    think_filter    匹配到tp自定义关键字,在关键字后加上空格字符串

    in_array_case    不区分


应用自定义函数库    App/Common/Common/function.php


ThinkPHP\Library/Think/Hook.class.php

    钩子标签形式 array('类型1'=>array('行为1','行为2'), '类型2'=>array('行为1','行为2'));

    覆盖导入钩子配置是覆盖类型,合并导入是同类型合并行为,不同类型增加行为

    listen监听tag类型,实质是按钩子配置下tag的行为类实例化并执行tag方法,Behavior行为类默认调用run方法



ThinkPHP\Library/Think/App.class.php

监听应用初始化(Hook::listen('app_init');),埋点

执行应用初始化App::init()

    加载动态应用公共文件和配置

    设置日至目录为绝对路径

    定义跟客户端请求相关的系统常量

    URL调度Dispatcher::dispatch();完成URL解析、路由和调度

        获取系统变量配置,主要是跟路由参数有关的配置,如模块,控制器,方法,以及兼容模式URL

        是否适用子域名部署(默认否)

        获取请求中的PATHINFO信息,分配到常量中

        获取模块名称并校验合法性(是否存在模块目录,是否不在禁止访问模块列表里,先从模块参数m中获取,如果没有则为默认配置模块名Home)

        定义当前模块路径,定义当前模块的模版缓存路径,定义当前模块的日志目录

        模块检测Hook::listen('module_check');

        检测并加载模块配置文件 模块/conf/config.php

        检测并加载应用模式配置 模块/conf/config_应用模式名.php

        检测并加载名模块别名配置 模块/conf/alias.php

        检测并加载模块tags文件定义 模块/conf/tags.php

        检测并加载模块函数库 模块/common/function.php

        获取URL模式配置,并做判断

        获取控制器的命名空间(路径)

        获取控制器名,先从控制器参数c中获取,如果没有则为默认配置控制器名Index)

        获取操作名,先从操作参数a中获取,如果没有则为默认配置操作名index)

        URL调度结束标签Hook::listen('url_dispatch'); 

        根据$_SERVER中的信息判断是否AJAX请求

监听应用开始(Hook::listen('app_begin');),埋点

非命令行模式下,启动session配置

记录应用初始化时间记录应用初始化时间(G('initTime');)

应用执行(App::exec();)

    创建控制器实例(controller(CONTROLLER_NAME,CONTROLLER_PATH); )

    通常控制器会use Think\Controller 并继承
        

    

监听应用结束(Hook::listen('app_end');)



ThinkPHP\Library/Think/Dispatcher.class.php

ThinkPHP\Library/Think/Route.class.php

ThinkPHP\Library/Think/Controller.class.php

ThinkPHP\Library/Think/View.class.php

ThinkPHP\Library/Behavior/BuildLiteBehavior.class.php

ThinkPHP\Library/Behavior/ParseTemplateBehavior.class.php

ThinkPHP\Library/Behavior/ContentReplaceBehavior.class.php

compile()???


加载系统惯例配置    ThinkPHP/Conf/convention.php

加载自定义配置    App/Common/Conf/config.php

同名参数自定义覆盖惯例

执行App::exec();

加载模式别名配置

加载自定义别名配置

同名参数自定义覆盖惯例


加载模式钩子配置

加载自定义钩子配置    


加载框架底层语言包    \ThinkPHP/Lang/zh-cn.php

将框架中的数组配置,用var_export导出并统一写入到缓存runtime文件.主要包含了多语言,钩子和别名定义

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

设置系统时区(默认是PRC,中国时区)

检查应用目录结构 如果不存在则自动创建,默认模块是Home

记录加载文件时间

运行应用(App::run();)


 















 












声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议