zoukankan      html  css  js  c++  java
  • ThinkPHP6 核心分析之发送响应和收尾工作

    说明

    前面所有分析,都是从 $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();
    }
    

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

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

    开始是想可能是析构函数调用了它,但也没有到有析构函数调用。最后发现,原来前面应用初始化的时候,加载了 thinkinitializerError 类,并执行了 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技术交流群

  • 相关阅读:
    函数和函数模版在一个。cpp中的情况!(除了左移和右移,其他的不要用友元函数!!!)
    const typedef 和指针的问题(这里必须初始化的才初始化了,不必须的则没有初始化)
    const constptr 和引用的盲点(未解决)
    对于数据流建模和行为级建模的梳理(重点)
    vivado实现模16的计数器
    用vivado实现4比特加法器
    三输入或门(发现这个玩意很不好耍,编程出现错误,不知道哪里出现的,一不小心2输成3也无法查证)
    SpringMVC第一个例子
    Mybatis与Spring的mapper代理整合方法
    Mybatis与Spring的原生Dao整合
  • 原文地址:https://www.cnblogs.com/it-abu/p/13989341.html
Copyright © 2011-2022 走看看