发送AJAX结果,但继续使用PHP进行处理

时间:2010-12-22 17:02:16

标签: php javascript ajax connection

我正在使用AJAX更新数据库中的某些值。所有人都非常精彩,但现在我想实现一些日志记录。日志记录功能看起来会花费相当多的处理时间,而且用户不必等待他们完成查看他们的AJAX结果。

所以,我正试图找到一种方法来发送AJAX结果,并仍然继续在服务器端进行处理。我的研究提出了ignore_user_abort函数,但显然我没有正确使用它。

This guide正是我的代码基础。

这是我的javascript(Jquery):

 $.ajax({
            type: "GET",
            url: "ajax.php",
            data: { "mydata": mydata },
            success: function(msg) {
                    $("span#status").fadeOut(200, function() {
                            $("span#status").html(msg);
                            $("span#status").fadeIn(200);
                    });

            }
    });

我的PHP:

    $response = "This is my response";

    //Begin code from link
    ob_end_clean();
    header("Connection: close");
    ignore_user_abort(true);
    ob_start();
    echo $response;
    header("Content-Length: " . mb_strlen($response));
    ob_end_flush();
    flush();
    //End code from link

    echo "I should not see this text";

不幸的是,我在flush();

之后看到了那个文本

有什么想法吗?

更新 - 修正:我发现了我的错误。在逐字复制不同的代码建议后,我认为它一定是我的apache / php配置中的错误。结果我需要添加两行来强制apache不要缓冲我的结果:

apache_setenv('no-gzip', 1);
ini_set('zlib.output_compression', 0);

2 个答案:

答案 0 :(得分:0)

嗯,你看到它,不是吗? 你告诉它回应

严肃地说,你的榜样应该有效。似乎代码在刷新后执行,因此如果flush将请求发送到浏览器,您应该能够进行日志记录。

答案 1 :(得分:0)

PHP脚本无法告诉浏览器关闭连接而不等待进一步的数据。使用flush();仅将链中的当前输出发送到Web服务器,但不保证它会立即到达浏览器。 Web服务器可以缓存输出,直到PHP脚本完成执行。

正如OP在最后一段中所写,解决方案是将Apache配置为不缓冲结果。