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

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

echo $epTitle . "<br>";
echo "<div>" . '<img src="' . $imgSrc . '" height="70" width="70">';
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.phpEcho 'string' while every long loop iteration (flush() not working)

有什么建议吗?谢谢。

【问题讨论】:

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

标签: php loops foreach echo


【解决方案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() 对我有用。

    【讨论】:

      猜你喜欢
      • 2016-04-09
      • 1970-01-01
      • 2016-07-29
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 2011-01-17
      相关资源
      最近更新 更多