在Ajax调用期间发送中间消息

时间:2018-06-15 14:56:04

标签: php jquery ajax

假设我们有一个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将一个接一个地更新每条消息。这可行吗?是否可以在请求和响应之间发送一些消息?

1 个答案:

答案 0 :(得分:2)

所有评论都忽略了HTTP服务器可以将流式响应发送回客户端的事实。

有几个PHP框架已经实现了这个(SymfonyLaravel等...)。如果你渴望没有一个人工作,那肯定是可能的,你可以从确保

开始
  1. 您的PHP后端更频繁地刷新输出缓冲区(通过输出缓冲)而不是最后一次刷新输出缓冲区:

    ob_start();
    echo "First";
    ob_flush();
    sleep(1);
    echo "Second";
    ob_flush();
    sleep(3);
    echo "Final";
    ob_flush();
    
  2. 当你使用一些FastCGI时,事情变得有点复杂。代理服务器可以选择自己缓冲,从而将流式响应呈现为正常响应。在这种情况下,您可能希望在每个flush()之后立即加入ob_flush()来电。此外,您可能还需要发送其他标题,提示服务器停止缓冲。

    1. 您的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 + "%");
          }
      
    2. 但是如果你已经有了websocket架构,那么就一般来说这可能更合适。

      希望这有点帮助...