仅在kernel.terminate事件之后返回响应

 Liko2502860873 发布于 2023-01-14 15:42
  • php
  • 我的理解kernel.terminate是它响应返回给客户端触发.

    在我的测试中,看起来并非如此.如果我sleep(10)在kernel.terminate中调用了一个函数.浏览器也等待10秒钟.处理似乎在发送响应之前发生.

    我在配置中有以下内容:

    calendar:
        class: Acme\CalendarBundle\Service\CalendarService
        arguments: [ @odm.document_manager, @logger, @security.context, @event_dispatcher ]
        tags:
            - { name: kernel.event_subscriber }
    

    我的订阅者类:

    class CalendarService implements EventSubscriberInterface
    {
        public static function getSubscribedEvents()
        {
            return array(
                'kernel.terminate' => 'onKernelTerminate'
            );
        }
    
        public function onKernelTerminate()
        {
            sleep(10);
            echo "hello";
        }
    }
    

    UPDATE

    这似乎与Symfony没有发送Content-Length标题有关.如果我生成它,响应将正确返回.

    // app_dev.php
    ...
    $kernel = new AppKernel('dev', true);
    $kernel->loadClassCache();
    $request = Request::createFromGlobals();
    $response = $kernel->handle($request);
    
    // --- START EDITS ---
    $size = strlen($response->getContent());
    $response->headers->set('Content-Length', $size);
    $response->headers->set('Connection', 'close');
    // ---- END EDITS ----
    
    $response->send();
    $kernel->terminate($request, $response);
    

    anushr.. 13

    这个问题对我的设置非常具体(Nginx,PHP-FCGI,Symfony).

    有一些问题导致了这个问题:

      symfony中不包括Content-Length也不Connection: close

      PHP-FCGI不支持该fastcgi_finish_request功能

      Nginx缓存来自PHP-FCGI的响应,因为Gzip已启用

    解决方案是从PHP-FCGI切换到PHP-FPM以获得支持fastcgi_finish_request.Symfony在执行内核终止逻辑之前在内部调用它,从而最终关闭连接.

    解决这个问题的另一种方法是关闭Nginx上的Gzip,但这对我来说不是一个真正的选择.

    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    热门标签
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有