【问题标题】:Progress Bar when running function inside foreach loop在 foreach 循环中运行函数时的进度条
【发布时间】:2012-02-15 18:30:26
【问题描述】:

我有一个 foreach 循环,它调用一个函数来为数组设置值。有时需要几个小时才能完成,具体取决于它必须通过函数运行多少次才能完成。

我想要的是一个进度条或至少一个 1/1000 完成的类型进度指示器。

这可能吗?如果是这样,我怎么能在我的代码中实现它?它会在函数中还是在 foreach 循环中?一直在研究并发现了一些使用 for 和 $i++ 的示例,但我不确定如何实现它,因为我已经在使用 foreach 循环。

非常感谢。

 function scrape_amazon($links) {
 //my code runs here to set all values in $ret array.
 }


 foreach($links as $link) {
$ret = scrape_amazon($link);
 }

【问题讨论】:

  • 也不行,PHP 根本无法做到这一点。您将需要 Ajax 和 JavaScript,并且可能需要一个完整的重组。除非你想要一个丑陋的连续冲洗,那绝对不是一个进度条。
  • 谢谢。我将研究 ajax 进度条,看看我能学到什么。希望我不必重组任何东西......
  • 小时!你期望一个人坐着看?为什么不在后台运行它,完成后让他们知道。
  • 这就是我现在所做的,但我希望能够定期检查它以查看它在步骤中的位置。

标签: php foreach progress-bar


【解决方案1】:

PHP 可能不是真正适合此任务的工具,但是您可以做的是:

  • 将慢速代码作为后台进程启动,并将进度输出到文件。
  • 有一个 PHP 脚本来轮询该文件以获取进度信息(通过页面刷新或 AJAX)

可以通过多种方式启动后台进程,包括:

  • 每 60 秒通过 cron 启动,并轮询在某些可读区域假脱机的新作业
  • 从网页通过 fork/exec 机制启动
  • 在系统启动时作为守护进程启动

需要一些努力来避免多次执行和/或重叠的问题。

【讨论】:

  • 我在 mysql 中创建了一个表并在每个循环中更新它。然后我使用 Ajax 读取每 5 秒轮询一次表的 php 文件。效果很好!感谢您的提示。
【解决方案2】:

我用这个,嗯,不是 ajax,只做冲洗,但没那么难看。

我放一张图片

<img src='progress.gif' height=18 width=0 name=probar>

然后在服务器上完成的每个事件上设置echo 一行,然后设置flush

echo "<script language='JavaScript'>\ndocument.probar.width=".(($sys["probar_width"]/$task_all)*$task_i).";\n</script>\n";
flush();

如果您的服务器(例如 apache)使用缓存(例如启用 gzip),它将无法正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2012-12-30
    • 2019-01-22
    • 2018-04-09
    • 2020-02-01
    • 1970-01-01
    相关资源
    最近更新 更多