使用PHP输出缓冲在处理过程中发出JavaScript

Using PHP Output Bufferering to Issue JavaScript During Processing

本文关键字:过程中 JavaScript 处理 PHP 输出 缓冲 使用      更新时间:2023-09-26

我有一些接收和处理大型图像的PHP代码。我想在处理图像时在某些点上回显一些JavaScript,以使用jQuery更新DOM。这里有一些示例代码,但它不起作用。它只需等待整整5秒钟,然后使警报连续发生。我希望它立即进行第一次警报,然后在5秒后进行下一次警报。

ob_start();
echo '<script type="text/javascript">alert(''1...'');</script>';
ob_flush();
sleep(5);
ob_start();
echo '<script type="text/javascript">alert(''2...'');</script>';
ob_flush();

有人能帮忙吗?

大多数浏览器都会缓冲内容,直到达到一定的大小。试着用一些东西填充脚本块,使它们变长。

另外:您应该调用flush,而不仅仅是ob_flush,并确保zlib压缩已关闭。

我有一些接收和处理大型图像的PHP代码。我想在处理图像时在某些点上回显一些JavaScript,以使用jQuery更新DOM。

这可能超出了你必须完成的范围,但我会使用AJAX。你当然可以得到你想要发生的事情,但从长远来看,这种方法并不好。

使用AJAX请求上传图像并获得结果,而不是提交整个页面并等待它在爬网时返回。然后,客户端上的计时器可以发出单独的AJAX"你做了多远?"请求。这两个PHP实例将通过在数据库中的作业条目上设置"完成"标志等进行通信。

虽然它使客户端的东西更加复杂,但它更容易处理用户交互(例如允许用户取消长时间运行的作业),并使PHP代码更加集中。

将其添加到脚本顶部即可:

for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
ob_implicit_flush(1);

据我所知,ob_implicit_flush(1)强制对每个输出语句进行刷新。因此其他ob_start()ob_flush()调用将不是必需的。我不知道这对你是否有效。

<?php
for ($i = 0; $i < ob_get_level(); $i++) { ob_end_flush(); }
ob_implicit_flush(1);
echo '<script type="text/javascript">alert(''1...'');</script>';
sleep(5);
echo '<script type="text/javascript">alert(''2...'');</script>';
?>

以下在FF4中工作:

<?php
echo '<script type="text/javascript">alert("1");</script>';
flush();
sleep(5);
echo '<script type="text/javascript">alert("2");</script>';
?>

我很久以前就用类似的东西实现了一个聊天"服务器"。它起作用了。

这些东西对此没有帮助。