PHP - 显示循环的状态


PHP - Display status of loop

我有一个PHP脚本,如下所示:

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

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

解决方案

谢谢大家!输出缓冲按建议工作。然而,大卫提供了宝贵的见解,并且也在考虑这种方法。

您可以缓冲和控制 PHP 脚本的输出。

但是,您可能需要考虑此设计的可伸缩性。 一般来说,繁重的流程不应该在线完成。 您的特定情况可能是一个优势,因为等待是可以接受的,但请考虑将以下内容作为改善用户体验的替代方案:

  1. 用户启动一个流程。 这可以像在数据库中的记录上设置标志或将一些"待处理"记录插入数据一样简单。
  2. 用户将立即被定向到指示进程已排队的页面。
  3. 脱机进程(由服务器上的 PHP 脚本启动或计划定期运行)检查数据并执行繁重的处理。
  4. 同时,用户可以刷新页面(手动,通过导航到其他地方并返回检查,甚至使用 AJAX 轮询机制更新页面)以检查处理状态。 在这种情况下,听起来数据库表中有几百条记录排队等待处理。 当每个完成时,它可以被标记为已完成。 该页面可以从数据中检查还剩下多少,哪个是最新的等。
  5. 处理完成后,页面将显示结果。

通常,这是更好的用户体验,因为它不会强制用户等待。 用户可以在站点中导航并根据需要检查进度。 此外,此方法的扩展性更好。 如果繁重的处理直接在页面上完成,那么当您有许多用户或数据处理负载增加时会发生什么情况? 页面会开始超时吗? 用户需要等待更长的时间吗? 通过将流程发生在网站范围之外,您可以在需要时将其卸载到更好的硬件上,确保根据业务规则要求以串行/并行方式处理记录(避免竞争条件),节省非高峰时段的处理等。

查看 PHP 的输出缓冲。

尝试使用:

flush();

http://php.net/manual/ru/function.flush.php

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

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

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