我正在使用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);
答案 0 :(得分:0)
嗯,你会看到它,不是吗? 你告诉它回应!
严肃地说,你的榜样应该有效。似乎代码在刷新后执行,因此如果flush将请求发送到浏览器,您应该能够进行日志记录。
答案 1 :(得分:0)
PHP脚本无法告诉浏览器关闭连接而不等待进一步的数据。使用flush();
仅将链中的当前输出发送到Web服务器,但不保证它会立即到达浏览器。 Web服务器可以缓存输出,直到PHP脚本完成执行。
正如OP在最后一段中所写,解决方案是将Apache配置为不缓冲结果。