PHP 进度指示器

问题描述

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

我有一个 PHP 脚本,可以向大约 200 人的邮件列表发送电子邮件。这需要几分钟的时间,我想在发送电子邮件时在屏幕上显示每个收件人的姓名,首先作为检查谁收到电子邮件以及作为进度指示器。从我所读到的,直到大约十年前,通过刷新输出缓冲区,这曾经是可能的,但是,由于处理方式的“进步”,这不再有效。显示长期运行任务的进度是完全合理的事情;某处一定有答案。有人知道是什么吗?

解决方法

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

在 CLI 的情况下,解决方案很简单。你的程序只是回显它必须回显的任何东西,它会实时出现在终端中。

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

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

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

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

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

,

我遇到了这种类型的问题,您可以使用 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();

?>

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...