【问题标题】:Server response during a loop (status update)循环期间的服务器响应(状态更新)
【发布时间】:2019-01-31 08:00:35
【问题描述】:

我编写了一个 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;
  }
}

还有其他选择可以让这个工作吗?或者我如何让代码“刷新”?

感谢您的帮助!

【问题讨论】:

  • 您也可以尝试使用exec 函数并使用文件或数据库等共享资源。然后你可以发送一个请求当前进度的时间间隔
  • @VitaliyKrushelnitsky 我认为短轮询是一种妥协,但由于流量问题,它并不完全令人满意

标签: php jquery ajax


【解决方案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 变量。

【讨论】:

  • 有朋友在公司网站上使用过这个解决方案,听起来效果很好。
猜你喜欢
  • 1970-01-01
  • 2020-10-04
  • 2020-12-10
  • 2021-12-28
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-02-23
  • 2015-10-29
相关资源
最近更新 更多