美文网首页PHP
ThinkPHP6 核心分析之发送响应和收尾工作

ThinkPHP6 核心分析之发送响应和收尾工作

作者: it阿布 | 来源:发表于2020-11-16 21:16 被阅读0次

说明

前面所有分析,都是从 response =http->run(); 展开的,经历了漫漫长路,run 方法终于运行完毕,返回一个 Response 对象,程序又回到入口文件:

.
.
.
$response = $http->run();

$response->send();

$http->end($response);

接下来是执行 $response->send();send 方法:

public function send(): void
{
    // 处理输出数据
    $data = $this->getContent();
    // 如果还沒有发送响应头且$this->header不为空
    if (!headers_sent() && !empty($this->header)) {
        // 发送状态码
        http_response_code($this->code);
        // 发送头部信息
        foreach ($this->header as $name => $val) {
            header($name . (!is_null($val) ? ':' . $val : ''));
        }
    }
    // 保存cookie
    $this->cookie->save();
    // 输出数据
    $this->sendData($data);
    // 参考:http://www.laruence.com/2011/04/13/1991.html
    if (function_exists('fastcgi_finish_request')) {
        // 提高页面响应
        fastcgi_finish_request();
    }
}

过程比较简单:发送状态码、发送响应头,然后发送响应内容。

收尾工作

接着是运行:$http->end($response);,展开如下:

public function end(Response $response): void
{
        $this->app->event->trigger(HttpEnd::class, $response);

        //执行中间件
        // 由此可以看出,可以在中间件添加end方法,在程序结束时执行
        $this->app->middleware->end($response);

        // 写入日志
        $this->app->log->save();
}

以上代码执行完了之后,整个生命周期本该结束了,发现程序竟然还继续执行 think\initializer\Error 类的 appShutdown 方法:

public function appShutdown(): void
{
    if (!is_null($error = error_get_last()) && $this->isFatal($error['type'])) {
        // 将错误信息托管至think\ErrorException
        $exception = new ErrorException($error['type'], $error['message'], $error['file'], $error['line']);

        $this->appException($exception);
    }
}

开始是想可能是析构函数调用了它,但也没有到有析构函数调用。最后发现,原来前面应用初始化的时候,加载了 think\initializer\Error 类,并执行了 init 方法:

 public function init(App $app)
{
    $this->app = $app;
    //开启所有级别错误提示
    error_reporting(E_ALL);
    //设置自定义的函数处理运行中的错误
    set_error_handler([$this, 'appError']);
    //设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常
    set_exception_handler([$this, 'appException']);
    //注册一个 callback ,它会在脚本执行完成或者 exit() 后被调用。
    register_shutdown_function([$this, 'appShutdown']);
}

该方法最后一行注册了一个回调,它会在脚本执行完成或者 exit () 后被调用。

点关注,不迷路

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。之前说过,PHP方面的技术点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了PDF和文档,如果有需要的可以

点击进入暗号: PHP+「平台」

在这里插入图片描述 在这里插入图片描述

更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的 PHP技术交流群

相关文章

  • ThinkPHP6 核心分析之发送响应和收尾工作

    说明 前面所有分析,都是从 http->run(); 展开的,经历了漫漫长路,run 方法终于运行完毕,返回一个 ...

  • 1、自定义 Handler 时如何有效地避免内存泄漏问题

    分析: 在Android系统中,Handler是一个消息发送和处理机制的核心组件之一,与之配套的其他主要组件还有L...

  • 2017.12.26日精进

    今日体验:今天把大修变速箱的天籁收拾利索了,收尾工作都做好了。 核心:收尾阶段的工作是最重要的,一定要认真仔细。

  • 收尾工作

    20180726反思 昨天上午我还我花费了很长时间将近两个多小时把油烟机清理一下,前天晚上已经清理一部分了,这两天...

  • 收尾工作

    1.获得客户或发起人和验收,以正式结束项目或阶段; 2.进行项目后评价或阶段结束评价; 3.记录裁剪任何过程的影响...

  • 收尾工作

    一 简介 项目收尾工具和技术的实践,是促进项目经理学习经验教训以及持续改进。持续改进的意义体现在持续学习,优秀与不...

  • 收尾工作!

    搬家已经快两周了。 还有好多地方,没有收拾出来呢。 从来没有想过,刚刚结婚四年的孩子们,会有如此多的东西。 简直颠...

  • 干活-扫尾-打扫战场

    收尾收尾,全面进入收尾工作。

  • Servlet工作原理解析(一)Servlet容器

    请结合这篇文章阅读Tomcat生命周期 Servlet是Java Web技术的核心基础,简单来说,处理请求和发送响...

  • 七绝•赠丰草-古筝

    伏羲逸响回音远,少艾临筝近影疏;凤起弦声相应和,鸾鸣丰草满鸿都。 注:初遇艾草弹奏之伏羲神天响曲,心折不已,后来艾...

网友评论

    本文标题:ThinkPHP6 核心分析之发送响应和收尾工作

    本文链接:https://www.haomeiwen.com/subject/myazbktx.html