PHP进度指示器

PHP进度指示器,php,progress-bar,buffering,Php,Progress Bar,Buffering,这是一个老问题,但有太多相互矛盾的答案,我再次问它 我有一个PHP脚本,可以向大约200人的邮件列表发送电子邮件。这需要几分钟的时间,我想在屏幕上显示发送电子邮件时每个收件人的姓名,首先是检查谁收到电子邮件,同时也是进度指示器。从我所读到的内容来看,直到大约十年前,通过刷新输出缓冲区,这种方法还是可行的,但是,由于事情处理方式的“进步”,这种方法不再有效。在一项长期运行的任务上显示进度是一件完全合理的事情;一定有答案。有人知道它是什么吗?嗯,您的PHP代码可以作为CLI独立应用程序运行,也可以作

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


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

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

对于CLI,解决方案很简单。你的程序只需回显它必须回显的内容,它就会实时出现在终端上

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

你可以使用图书馆,比如。除了所有花哨的词语之外,WebSocket是双工通道,保持开放,客户端向服务器发送信息,反之亦然。如果您坚持使用websocket,那么您只需要打开websocket连接,并在进展过程中向客户端发送更新信息

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

您可以将实际进度保存在某个位置,并通过重复请求


也有一些不切实际的方法,比如使用永久帧,但我不鼓励您查找或使用它们。

我遇到过此类问题,您可以使用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();

?>

这是一个普通的比较法

我不确定您所说的哪些“进步”会使旧答案不再适用。如果你尝试了一些东西,但没有成功,那么问一下为什么不成功可能会更清楚。