【问题标题】:PHP Progress IndicatorPHP 进度指示器
【发布时间】:2021-05-10 13:24:29
【问题描述】:

这是一个老问题,但那里有太多相互矛盾的答案,我再问一次。

我有一个 PHP 脚本,它可以向大约 200 人的邮件列表发送电子邮件。这需要几分钟的时间,我想在发送电子邮件时在屏幕上显示每个收件人的姓名,首先是检查谁收到了电子邮件,也是一个进度指示器。根据我的阅读,直到大约十年前,通过刷新输出缓冲区才能实现这一点,但是由于事情完成方式的“进步”,这不再有效。在一项长期运行的任务上显示进度是一件非常合理的事情。一定有答案的地方。有人知道是什么吗?

【问题讨论】:

  • 我不确定您所说的哪些“进步”会使旧答案不再适用。如果您尝试过某事但没有成功,那么问为什么不这样做可能会更清楚。

标签: php progress-bar buffering


【解决方案1】:

嗯,您的 PHP 代码可以作为 CLI 独立应用程序运行,也可以作为 Web 应用程序的服务器端运行,也可以由 cron 作业诱导运行。由于您想在屏幕上看到进度条,我假设您可能错误地认为您对 cron 作业/hb 任务场景不感兴趣,但是,如果您这样做了,那么解决方案与 webapp 场景只会略有不同。

在 CLI 的情况下,解决方案很简单。您的程序只是回显它必须回显的任何内容,它将实时显示在终端中。

现在,对于 webapp,您有两个参与者:服务器和客户端。如果服务器只在一切都完成后才响应,那么在漫长的等待之后,您将在客户端看到 100%,这当然不是您所期望的。现在,您需要 1. 在服务器端输出项目 2. 从客户端获取进度。

您可以使用Websocket 库,例如Rachet。除了所有花哨的词外,websockets 是双工通道,保持打开状态,客户端将信息发送到服务器,反之亦然。如果你坚持使用 websockets,那么你只需要打开一个 websocket 连接,并在进度发生时向客户端发送更新信息。

您可以使用push notifications,因为在这种情况下信息流是单向的。

您可以将实际进度保存在某处,并通过AJAX polling 反复请求。

还有一些 hacky 方法,例如使用永久框架,但我不鼓励您查找或使用它们。

【讨论】:

    【解决方案2】:

    我遇到过此类问题,您可以使用 ob_start() 和 ob_end_flush() 函数输出脚本的进度

    <?php
    
    function rappel($buffer)
    {
      // remplace toutes les pommes par des carottes
      return (str_replace("pommes de terre", "carottes", $buffer));
    }
    
    ob_start("rappel");
    
    ?>
    <html>
    <body>
    <p>C'est comme comparer des carottes et des pommes de terre.</p>
    </body>
    </html>
    <?php
    
    ob_end_flush();
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      相关资源
      最近更新 更多