【问题标题】:Why symfony controller keeps executing after user close the browser? [duplicate]为什么用户关闭浏览器后 symfony 控制器继续执行? [复制]
【发布时间】:2017-10-10 19:21:50
【问题描述】:

下面是我的控制器。为什么在访问/test 后关闭浏览器,控制器仍然运行?这是正常行为吗?我没有使用ignore_user_abort之类的任何配置?

为什么这个控制器在我关闭浏览器后仍然输出日志?

    /**
     * @Route("/test")
     */
    public function testAction() {

        $logger = $this->get('exception.logger');

        for ($i = 0; $i < 100; $i++) {
            $logger->info("[{$i}] ------------------------------- ");

            sleep(1);
        }

        $response = new StreamedResponse(function() use($logger) {

            for ($i = 0; $i < 100; $i++) {
                $logger->info("[{$i}] ******************************************* ");

                sleep(1);
            }
        });


        $filename = "test.csv";

        $response->headers->set('Content-Type', 'application/force-download');
        $response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"');

        return $response;
    } 

【问题讨论】:

  • 这是一个服务器端代码,即使你关闭浏览器(客户端)服务器继续执行请求
  • PHP 不会检测到用户已中止连接,直到尝试向客户端发送信息。简单地使用 echo 语句并不能保证发送信息,请参阅 flush()。

标签: symfony


【解决方案1】:

PHP 代码是服务器端的。无论您是否关闭浏览器,Web 服务器日志都会继续在服务器上进行。这是正常行为。请参阅此 stackoverflow 问题以获得更好的解释:Can closing the browser terminate the PHP script on the server?

【讨论】:

  • 那么ignore_user_abort有什么用呢?
  • 如果你的 php 脚本试图输出一些东西(到浏览器),它会注意到不再有连接。 ignore_user_abort 将告诉 php 脚本继续运行(它通常会在注意到您已关闭浏览器时停止,但在尝试向浏览器发送某种类型的输出之前不会注意到)。
  • 如果示例控制器断开连接,如何检测?
  • 我不确定您到底想要完成什么,但我的建议是尝试找到一种不依赖于检查浏览器是否关闭的方法,因为您需要一段时间服务器意识到连接丢失。几乎总是有不止一种方法可以给猫剥皮……休息一下,让你的头脑清醒一下,然后从不同的角度解决这个问题。我不知道有一种可靠的方法可以立即知道连接何时丢失。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 2018-01-19
相关资源
最近更新 更多