在 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 回显的主要内容,如果未能解决你的问题,请参考以下文章