Blogger Information
Blog 25
fans 0
comment 0
visits 16820
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
TP3.23源码解析执行流程
力挽狂澜的博客
Original
2061 people have browsed it

 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();)


 















 












Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post