一个循环(状态更新)时服务器响应

时间:2019-01-30 17:14:09

标签: php jquery ajax

我编写了一个ajax函数来调用一个脚本,该脚本创建了约500个文件的zip存档。有一个循环可将文件添加到存档中。该循环包含一个文件计数器。现在,我想每50个文件更新浏览器中的状态一次。但是当脚本结束并且zip文件完成时,php脚本将发送整个输出。

的原理非常类似于以下柱: Echo 'string' while every long loop iteration (flush() not working)

(除非溶液不工作我的服务器上)

我找到了很多可能的解决方案,但没有任何效果...

我用flush / ob_flush方法(也有ob_implicit_flush)尝试过,但是刷新内容对我不起作用。我在服务器配置上玩了一点,但没有帮助。同样,所有示例均无效。也许是服务器问题。

我尝试了SSE,但脚本结束后下一次响应也成功了。

我尝试使用WebSocket,但是握手时遇到了一些问题。

的代码看起来是这样的

$filecounter = 0;
foreach ($files as $file) {
  // add $file to zip archive
  $filecounter++;
  if ($filecounter % 50 == 0) {
    echo $filecounter;
  }
}

还有其他选择可以使它正常工作吗?还是我如何使代码“混乱”?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以将进度存储在Session中,并使用第二个ajax调用来跟踪进度:

$filecounter = 0;
foreach ($files as $file) {
  // add $file to zip archive
  $filecounter++;
  if ($filecounter % 50 == 0) {
    session_start();
    $_SESSION['progress'] = $filecounter;
    session_write_close();
  }
}

您需要session_write_close();才能使第二个脚本可以访问Session变量。