假设我们有一个Ajax调用。这只是一个例子:
function delete_mov(id){
$.ajax("delete_mov.php?id="+id
)
.success(function(){
$('#message').("Movimento "+id+" correttamente cancellato");
})
.fail(function(){
$('#message').("Problemi a cancellare il movimento "+id);
});
}
它将按预期完成其工作。假设PHP背后将需要一些时间来执行,并且php代码在完成执行步骤时发送一些消息。例如:
<?php
//do first part of code
echo "First step completed";
//do second part of code
echo "Second step completed;
//do third part of code;
echo "Third step completed;
//do last part of code
//send success message back to Ajax
?>
我想做的是在PHP回显每条消息时从ajax调用接收回来,以便消息div将一个接一个地更新每条消息。这可行吗?是否可以在请求和响应之间发送一些消息?
答案 0 :(得分:2)
所有评论都忽略了HTTP服务器可以将流式响应发送回客户端的事实。
有几个PHP框架已经实现了这个(Symfony,Laravel等...)。如果你渴望没有一个人工作,那肯定是可能的,你可以从确保
开始您的PHP后端更频繁地刷新输出缓冲区(通过输出缓冲)而不是最后一次刷新输出缓冲区:
ob_start();
echo "First";
ob_flush();
sleep(1);
echo "Second";
ob_flush();
sleep(3);
echo "Final";
ob_flush();
当你使用一些FastCGI
时,事情变得有点复杂。代理服务器可以选择自己缓冲,从而将流式响应呈现为正常响应。在这种情况下,您可能希望在每个flush()
之后立即加入ob_flush()
来电。此外,您可能还需要发送其他标题,提示服务器停止缓冲。
您的JS前端使用progress
回调。请参阅此问题以获取示例:What is the cleanest way to get the progress of JQuery ajax request?
$.ajax({....})
.done(function(){ ....... })
.fail(function(){ ....... })
.progress(function(value) {
console.log('Progress: ', value + "%");
}
但是如果你已经有了websocket架构,那么就一般来说这可能更合适。
希望这有点帮助...