在 foreach 循环中每次迭代后 PHP 回显

Posted

技术标签:

【中文标题】在 foreach 循环中每次迭代后 PHP 回显【英文标题】:PHP echo after every iteration in foreach loop 【发布时间】:2018-09-01 13:31:49 【问题描述】:

我试图在 php 中的 foreach 循环的每次迭代后回显。回声在全部完成之前不会渲染。我已经尝试了各种帖子的建议,但没有一个有效。我的一些代码是:

echo $epTitle . "<br>";
echo "<div>" . '<img src="' . $imgSrc . '"  >';
echo "<button onclick='grabVid(" . '"' . $pageUrl . '"' ..")'>Grab</button>";

我尝试了以下方法:

flush();

.

flush();
ob_flush();

.

while (ob_get_level() > 0)
ob_end_flush();

.

@ini_set('zlib.output_compression', 0);
@ini_set('implicit_flush', 1);
@ob_end_clean();

以及其他来自: http://php.net/manual/en/function.flush.php 和 Echo 'string' while every long loop iteration (flush() not working)

有什么建议吗?谢谢。

【问题讨论】:

我成功完成此任务的唯一方法是使用 Ajax 请求。否则 PHP 脚本将处理所有内容,然后将输出发回。 @MarkSkayff 我正在使用 Ajax 发布方法,该方法发布到上述脚本。每次迭代后它仍然没有回显。 因为 HTTP 通常不是这样工作的。 Web 服务器先发送标头,然后再发送响应正文。在请求完成之前不会发送任何内容,因此会发送正确的标头(HTTP 状态代码、内容类型、内容长度)。 【参考方案1】:

如果您使用 XHR (AJAX) 并希望流式传输响应,则需要使用 onprogress 定期检查它。在收到响应时,onreadystatechange 事件不会触发,因为readyState 将始终为loading,并且在请求完成之前不会更改。

这是一篇关于这个主题的好文章:

PHP Streaming and Output Buffering explained

它包含 XHR 部分的示例 javascript

xhr = new XMLHttpRequest();
xhr.open("GET", "response.php", true);
xhr.onprogress = function(e) 
  alert(e.currentTarget.responseText);

xhr.onreadystatechange = function() 
  if (xhr.readyState == 4) 
    console.log("Complete = " + xhr.responseText);
  

xhr.send();

(我不知道该示例是否有任何理由在onprogress 事件处理程序中使用e.currentTarget 而不是xhr - 我只是照原样复制了示例。)

如果您计划执行此循环超过 30 秒,您的 PHP 脚本可能会被终止。您可以extend the default time limit,但如果您的站点有很多用户,您希望请求尽可能短,以获得最佳服务器可用性。

这意味着重写您的循环,以便每次迭代都是一个 HTTP 请求。

【讨论】:

【参考方案2】:

在 echo 之后使用 ob_flush() 对我有用。

【讨论】:

以上是关于在 foreach 循环中每次迭代后 PHP 回显的主要内容,如果未能解决你的问题,请参考以下文章

如何在foreach循环中每5次迭代后定义html标签

如何在PHP的foreach循环中重复特定的迭代?

Mybatis 中 foreach 用法

Angular - 在每次 forEach 迭代后插入值

不要在 foreach 引导程序中循环代码

php中for循环与foreach循环效率比较