PHP - 显示循环的状态

时间:2011-05-18 16:56:31

标签: php loops

我有一个类似的PHP脚本:

$i=0;
for(;$i<500;++i) {
   //Do some operation with files numbered 0 to 500;
}

问题是,脚本工作并显示最终结果,但操作需要一段时间,并且观看空白屏幕可能会令人沮丧。我在想是否有某种方法可以在客户端继续更新页面,详细说明当前正在处理哪个文件。也就是说,我可以显示并持续更新 $ i 的当前值吗?

解决方案

谢谢大家!输出缓冲正如建议的那样工作。然而,David提供了有价值的见解,并且正在考虑这种方法。

4 个答案:

答案 0 :(得分:3)

您可以从PHP脚本中buffer and control the output

但是,您可能需要考虑此设计的可扩展性。一般而言,重型流程不应在线完成。您的特定情况可能是一个优势,因为等待是可以接受的,但考虑这样的事情可以改善用户体验:

  1. 用户启动流程。这可以像在数据库中的记录上设置标志或将一些“待处理”记录插入数据一样简单。
  2. 立即将用户定向到指示进程已排队的页面。
  3. 脱机过程(由服务器上的PHP脚本启动或计划定期运行)检查数据并执行繁重的处理。
  4. 与此同时,用户可以刷新页面(手动,通过导航到其他地方并返回检查,甚至使用AJAX轮询机制来更新页面)来检查处理的状态。在这种情况下,听起来你在排队等待处理的数据库表中有几百条记录。每个人完成后,都可以标记为已完成。该页面可以从数据中查看剩余的数量,哪一个是当前的等等。
  5. 处理完成后,页面会显示结果。
  6. 通常,这是一种更好的用户体验,因为它不会强迫用户等待。用户可以浏览站点并根据需要检查进度。此外,这种方法更好地扩展。如果您的繁重处理是直接在页面上完成的,那么当您有许多用户或数据处理负载增加时会发生什么?页面会开始超时吗?用户是否需要等待更长时间?通过使该过程发生在网站范围之外,您可以根据需要将其卸载到更好的硬件上,确保按照业务规则的要求(避免竞争条件)以串行/并行方式处理记录,保存非高峰时段的处理等

答案 1 :(得分:1)

答案 2 :(得分:0)

答案 3 :(得分:0)

尝试flush()功能。调用此函数会强制PHP将其到目前为止输出的任何内容发送到客户端,而不是等待脚本结束。

但是,一些Web服务器只会在构建完整个页面后发送输出,因此在这种情况下调用flush()将无效。

此外,浏览器本身缓冲输入,因此您可能会遇到问题。例如,某些版本的IE在收到256个字节之前不会开始显示页面。