【发布时间】: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 我认为短轮询是一种妥协,但由于流量问题,它并不完全令人满意