代码之家  ›  专栏  ›  技术社区  ›  TheBat

死后运行清理代码()

  •  0
  • TheBat  · 技术社区  · 10 年前

    我正在努力加快一些生成html的php代码的响应时间。代码的一个问题是,当确定不需要显示一条信息时,它会发出一个sql调用,从数据库中删除该项。这对于用户来说是不可见的,并且在下一次加载页面之前,服务器将不可见,因此,只要系统知道应该运行sql查询,就不需要立即运行sql查询。

    我想做的是用生成的html将响应返回给用户,然后进行sql查询。我在尝试这个 flush ob_flush ,但在我调用die之前,页面响应仍然没有加载。

    在调用 die() 这样用户就可以获得他们的数据,然后我就可以运行我的数据库清理代码,而客户端就不再等待我关闭连接了?

    2 回复  |  直到 10 年前
        1
  •  3
  •   robbrit    10 年前

    可以使用注册关闭函数 register_shutdown_function :

    register_shutdown_function(function () {
        // cleanup stuff
    });
    

    或者在旧版本的PHP中:

    function myFunc() {
      // cleanup stuff
    }
    
    register_shutdown_function("myFunc");
    
        2
  •  0
  •   TheBat    10 年前

    感谢@robbrit和@Luis Siquot。我在看 register_shutdown_function 因为路易斯的评论,我在看那页的评论 "When using php-fpm, fastcgi_finish_request() should be used instead of register_shutdown_function() and exit()"

    这让我 fastcgi_finish_request 上面写着:

    "This function flushes all response data to the client and finishes the request. This allows for time consuming tasks to be performed without leaving the connection to the client open."

    所以看起来 fastcgi_finish_request() 是我要找的,不是 register_shutdown_function()

    编辑:似乎 fastcgi_finish_request() 需要另一个库,因此请改用:

    ob_end_clean();
    header("Connection: close");
    ignore_user_abort(true); // just to be safe
    ob_start();
    echo "The client will see this!";
    $size = ob_get_length();
    header("Content-Length: $size");
    
    //Both of these flush methods must be called, otherwise strange things happen.
    ob_end_flush();
    flush();
    
    echo "The client will never see this";