详细解析Thinkphp5.1源码执行入口文件index.php运行过程
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了详细解析Thinkphp5.1源码执行入口文件index.php运行过程,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3142字,纯文字阅读大概需要5分钟。
内容图文
![详细解析Thinkphp5.1源码执行入口文件index.php运行过程](/upload/InfoBanner/zyjiaocheng/835/ac9233ddf918425c953a5419a76a622f.jpg)
详细解析Thinkphp5.1源码执行入口文件index.php运行过程
运行了public目录下的index.php文件后,tp的运行整个运行过程的解析
入口文件index.php代码如下:
<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006-2018 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> // +---------------------------------------------------------------------- // [ 应用入口文件 ] namespace think; // 加载基础文件 require __DIR__ . '/../thinkphp/base.php'; // 支持事先使用静态方法设置Request对象和Config对象 // 执行应用并响应 Container::get('app')->run()->send();
解析:
1. 执行require __DIR__ . '/../thinkphp/base.php'; 引入base.php,实现自动加载机制。自动加载机制的实现过程请看上一篇文章。
2. 重点解析这行代码:执行Container::get('app')->run()->send(); 通过容器注册App,并且执行think\App.php的run()方法,将执行到的结果给到think\Response.php的send()响应请求。
具体过程如下:
- 通过容器Container通过反射模式注册实例化app类
- 调用app类应用程序初始化run方法
- 初始化应用-run()
- 初始化应用-initialize()
- 设置环境变量目录,如runtime_path、vendor_path、app_path、root_path、route等。-initialize()
- 加载环境变量配置.env-initialize()
- 注册应用命名空间-initialize()
- 初始化应用-init()
- 找到当前运行模块
- 判断缓存配置文件是否存在,存在,则加载初始化文件init.php,不去读取应用或模块下的配置文件
- 不存在,则去读取应用或模块下的配置文件,如:tags、common、provider、middleware等
- 如果模块下拥有同样的配置,那么模块下的配置即覆盖应用下的配置
- 初始化数据库配置
- 读取语言包
- 路由初始化
- 路由检测
- 检测是否有缓存
- 是否开启强制路由
- 路由检测-$this->route->check($path, $must);【此时如果路由找不到,且路由中未定义miss,则在这里抛出异常。】
- 自动检测域名路由
- 检测域名路由
- 检测域名路由别名
- 检测URL绑定
- 路由组检测路由-RuleGroup->check()【一个请求地址遍历路由文件一个一个匹配,是否匹配中】
- 检测是否跨域路由设置,是则加跨域,跨域参数加在$this->option变量中
- 检测路由分组有效性,路由请求是否与路由设置一致,如请求类型、域名、参数等
- 检测路由前置行为,并通过容器方式注册钩子,并执行行为。所以,路由中的行为在路由检测中就执行了。
- 路由分组检测think\Route\RouteItem->check();
- 匹配中路由,返回路由分发地址
- 匹配中路由,通过中间件过度执行路由匹配结果,$response = $this->middleware->dispatch($this->request);【如果路由找不到,且路路由中定义了miss,则在这里跑出miss对应的路由。】
- 如果有绑定中间件,则执行中间件。如果中间件接手返回机制,返回一个response对象,则不会执行路由的分发机制。否则,中间件执行完,执行到return $next($request);的时候,继续执行路由的分发机制-think\Route\Dispatch。
- 执行路由分发机制-think\Route\Dispatch的时候才执行路由的后置行为。【路由后置行为建议使用中间件替代】(来自源码)
- 执行完run。返回执行结果。【路由分发的执行结果(来自控制器)或中间件的执行结果】
- 执行think\Response的send()响应请求。【注意:如果代码中自定义了返回机制,且die或exit,则不会走到这一步,则路由中定义的header跨域之类的也因此不会生效,需要自定义header返回处理】
内容总结
以上是互联网集市为您收集整理的详细解析Thinkphp5.1源码执行入口文件index.php运行过程全部内容,希望文章能够帮你解决详细解析Thinkphp5.1源码执行入口文件index.php运行过程所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。