我编写了一个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;
}
}
还有其他选择可以使它正常工作吗?还是我如何使代码“混乱”?
感谢您的帮助!
答案 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变量。