thinkphp5.0框架运行机制分享小结
1 访问index.php 入口文件,定义应用目录,加载框架引导文件
- <?php
- // [ 应用入口文件 ]
- // 定义应用目录
- define('APP_PATH', __DIR__ . '/../application/');
- // 加载框架引导文件
- require __DIR__ . '/../thinkphp/start.php';
2 加载base基础文件,定义目录常量环境常量,加载loader类,注册自动加载,注册错误和异常处理机制,加载惯例配置文件
2.1 注册自动加载机制
- public static function register($autoload = '')
- {
- // 注册系统自动加载
- spl_autoload_register($autoload ?: 'think\\Loader::autoload', true, true);
- // 注册命名空间定义
- self::addNamespace([
- 'think' => LIB_PATH . 'think' . DS,
- 'behavior' => LIB_PATH . 'behavior' . DS,
- 'traits' => LIB_PATH . 'traits' . DS,
- ]);
- // 加载类库映射文件
- if (is_file(RUNTIME_PATH . 'classmap' . EXT)) {
- self::addClassMap(__include_file(RUNTIME_PATH . 'classmap' . EXT));
- }
- // Composer自动加载支持
- if (is_dir(VENDOR_PATH . 'composer')) {
- self::registerComposerLoader();
- }
- // 自动加载extend目录
- self::$fallbackDirsPsr4[] = rtrim(EXTEND_PATH, DS);
- }
备注:spl_autoload_register
2.2 注册错误和异常处理机制
- /**
- * 注册异常处理
- * @return void
- */
- public static function register()
- {
- error_reporting(E_ALL); // 设置函数允许错误报告的等级 error_reporting 0 关闭 E_ERROR | E_WARNING | E_PARSE 分别为错误 警告 解析错误 E_ALL 报告所有错误
- set_error_handler([__CLASS__, 'appError']); //设置用户自定义的错误处理函数
- set_exception_handler([__CLASS__, 'appException']); //设置用户自定义的异常处理函数
- register_shutdown_function([__CLASS__, 'appShutdown']); //注册一个会在php中止时执行的函数
- }
2.3 加载惯例配置文件
将convention文件中的的配置保存在已数组的形式$config常量中
- // 加载惯例配置文件
- \think\Config::set(include THINK_PATH . 'convention' . EXT);
2.4执行应用
- // 执行应用
- App::run()->send();
- /**
- * 发送数据到客户端
- * @access public
- * @return mixed
- * @throws \InvalidArgumentException
- */
- public function send()
- {
- // 监听response_send
- Hook::listen('response_send', $this);
- // 处理输出数据
- $data = $this->getContent();
- // Trace调试注入
- if (Env::get('app_trace', Config::get('app_trace'))) {
- Debug::inject($this, $data);
- }
- if (200 == $this->code) {
- $cache = Request::instance()->getCache();
- if ($cache) {
- $this->header['Cache-Control'] = 'max-age=' . $cache[1] . ',must-revalidate';
- $this->header['Last-Modified'] = gmdate('D, d M Y H:i:s') . ' GMT';
- $this->header['Expires'] = gmdate('D, d M Y H:i:s', $_SERVER['REQUEST_TIME'] + $cache[1]) . ' GMT';
- Cache::tag($cache[2])->set($cache[0], [$data, $this->header], $cache[1]);
- }
- }
- if (!headers_sent() && !empty($this->header)) {
- // 发送状态码
- http_response_code($this->code);
- // 发送头部信息
- foreach ($this->header as $name => $val) {
- if (is_null($val)) {
- header($name);
- } else {
- header($name . ':' . $val);
- }
- }
- }
- echo $data;
- if (function_exists('fastcgi_finish_request')) {
- // 提高页面响应
- fastcgi_finish_request();
- }
- // 监听response_end
- Hook::listen('response_end', $this);
- // 清空当次请求有效的数据
- if (!($this instanceof RedirectResponse)) {
- Session::flush();
- }
- }
thinkphp5.0框架运行机制分享小结的更多相关文章
- 对thinkphp5.0框架的实例学习
不论是渗透测试还是代码审计的过程中会碰到用不同的框架搭建起来的网站,熟悉这些框架的基本原理,会帮助我们快速的理解漏洞原理,提高干活效率,所以自己本地搭了个php环境,来入门实例学习下thinkphp5 ...
- ThinkPHP5.0框架开发--第2章 TP5.0架构
ThinkPHP5.0框架开发--第2章 TP5.0架构 第2章 TP5.0架构 ================================================== 上次复习 1.如 ...
- ThinkPHP5.0框架开发--第1章 Tp5.0安装
ThinkPHP5.0框架开发--第1章 Tp5.0安装 第1章 Tp5.0 安装 ======================================================== 今 ...
- ThinkPHP5.0框架开发--第7章 TP5.0数据库操作
ThinkPHP5.0框架开发--第7章 TP5.0数据库操作 第7章 TP5.0数据库操作 ===================================================== ...
- thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
这篇文章主要介绍了thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法,结合简单示例形式分析了thinkPHP5框架验证码相关配置.后台验证.前台刷新等操作技巧,学习thinkphp源码的朋 ...
- ThinkPHP5.0框架事务处理操作简单示例
本文介绍ThinkPHP5.0框架事务处理操作,结合实例形式分析了ThinkPHP5针对删除操作的事务处理相关操作技巧,可以加深对ThinkPHP源码的理解,需要的朋友可以参考下 事务的调用在mysq ...
- ThinkPHP5.0框架开发实现简单的页面跳转
ThinkPHP5.0框架开发实现简单的页面跳转 一.效果 登录界面 登录成功界面 登录失败界面 二.目录结构 三.代码 控制器中的Login.php <?php // 声明命名空间 names ...
- ThinkPHP5.0框架开发--第5章 TP5.0 控制器
ThinkPHP5.0框架开发--第5章 TP5.0 控制器 第5章 TP5.0 控制器 ============================================== 上次复习 1.路 ...
- ThinkPHP5.0框架开发--第4章 TP5.0路由
ThinkPHP5.0框架开发--第4章 TP5.0路由 第4章 TP5.0 路由 ================================================== 上次复习 1. ...
随机推荐
- Go的Channel发送和接收
先来看一道面试题: 对已经关闭的 chan 进行读写,会怎么样?为什么? 在上一篇学习 Go 协程的文章中,知道 go 关键字可以用来开启一个 goroutine 进行任务处理,但多个任务之间如果需要 ...
- 【LeetCode】26. 删除有序数组中的重复项
26. 删除有序数组中的重复项 知识点:数组:排序:双指针: 题目描述 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度. 不要使用额外的 ...
- Liunx搭建Mysql服务器
1:安装从网上下载文件的wget命令[root@master ~]# yum -y install wget 2:下载mysql的repo源[root@master ~]# wget http://r ...
- 第12篇-认识CodeletMark
InterpreterCodelet依赖CodeletMark完成自动创建和初始化.CodeletMark继承自ResourceMark,允许自动析构,执行的主要操作就是,会按照Interpreter ...
- flutter中存储键值对简单数据(相当于前端localstorage概念)
首先需要安装一个官方推荐包: 1 dependencies: 2 flutter: 3 sdk: flutter 4 shared_preferences: any // 先获取 shared pre ...
- C#中的垃圾回收
- [题解] Luogu P5446 [THUPC2018]绿绿和串串
[题解] Luogu P5446 [THUPC2018]绿绿和串串 ·题目大意 定义一个翻转操作\(f(S_n)\),表示对于一个字符串\(S_n\), 有\(f(S)= \{S_1,S_2,..., ...
- redis rpoplpush列表转移元素
文档出处:redisdoc.com/list/rpoplpush.html模式: 安全的队列 Redis的列表经常被用作队列(queue),用于在不同程序之间有序地交换消息(message).一个客户 ...
- new Vue({ render: h => h(App), }).$mount('#app')
这里创建的vue实例没有el属性,而是在实例后面添加了一个$mount('#app')方法. $mount('#app') :手动挂载到id为app的dom中的意思 当Vue实例没有el属性时,则该实 ...
- 地图控件:overview、scale、toolbar
地图常用控件: 1.AMap.MapType:地图类型切换插件,用来切换固定的几个常用图层 2.AMap.OverView:地图鹰眼插件,默认在地图右下角显示缩略图 3.AMap.Scale:地图比例 ...