【问题标题】:Realtime php script execution progress via Ajax通过 Ajax 的实时 php 脚本执行进度
【发布时间】:2021-06-01 18:36:39
【问题描述】:

我正在尝试用 javascript 编写代码,该代码将运行带有 AJAX 请求的 PHP 脚本、动态下载其进度、显示进度条并返回当前消息。

解决方案中途因为我无法解决两个错误:

  1. 反馈消息重复,显示:

设置... 设置...分析... 设置...分析...退出

相反

设置... 分析... 退出

  1. 我无法计算出准确的进度条,因为使用 ob_flush() 和 flush() 时 e.total 为 0

值得一提的是,每次运行脚本时返回消息的数量会有所不同(动态),因此我无法像互联网上的示例那样计算总值。

$('#import').on('submit', function(e) {

  e.preventDefault();

  $.ajax({
    url: $(this).prop('action'),
    method: $(this).prop('method'),
    xhrFields: {
      onprogress: function(e) {
        $('#logs').append('<p>' + e.target.responseText + '</p>');
        $('progress').val((e.loaded / e.total) * 100);
      }
    },
    success: function(response) {
      console.log(response);
    }
  });

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form id="import" method="POST" action="import.php">
  <div id="logs"></div>
  <progress max="100" value="0"></progress>
  <button type="submit">Run</button>
</form>

这是用于测试目的的 import.php 文件的内容:

echo 'Set up...';
ob_flush();
flush();
sleep(1);
    
echo 'Analyzing...';
ob_flush();
flush();
sleep(1);
    
echo 'Exit';
ob_flush();
flush();
sleep(1);

【问题讨论】:

    标签: javascript php jquery


    【解决方案1】:

    您可以将先前的响应保存在临时变量中。然后比较之前的响应是否与当前的响应相同。

    $('#import').on('submit', function(e) {
    
    
      e.preventDefault();
      var previousResponse = ''
    
      $.ajax({
        url: $(this).prop('action'),
        method: $(this).prop('method'),
        xhrFields: {
          onprogress: function(e) {
            var response = e.target.responseText
    
            if(previousResponse !== response){
              $('#logs').append('<p>' + response + '</p>');
            }
            var previousResponse = response
    
            $('progress').val((e.loaded / e.total) * 100);
          }
        },
        success: function(response) {
          console.log(response);
        }
      });
    
    });
    

    【讨论】:

    • 感谢您的回复,但您的案例将永远存在。 php 脚本返回按顺序执行的每一行,并将其添加到前面的行中。因此 test... !== test... test2... 而不是过滤客户端的响应,我宁愿消除后端的错误
    • 当我使用此回复中的子字符串时:stackoverflow.com/a/42083534/8375683 它工作正常,但我仍然不知道如何获得 e.total
    猜你喜欢
    • 2016-03-19
    • 2017-03-21
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    相关资源
    最近更新 更多