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技术交流群

  • 相关阅读:
    PyQt作品 – PingTester – 多点Ping测试工具
    关于和技术人员交流的一二三
    Pyjamas Python Javascript Compiler, Desktop Widget Set and RIA Web Framework
    Hybrid Qt applications with PySide and Django
    pyjamas build AJAX apps in Python (like Google did for Java)
    PyQt 维基百科,自由的百科全书
    InfoQ:请问为什么仍要选择Java来处理后端的工作?
    Eric+PyQt打造完美的Python集成开发环境
    python select module select method introduce
    GUI Programming with Python: QT Edition
  • 原文地址:https://www.cnblogs.com/it-abu/p/13989341.html
Copyright © 2011-2022 走看看