I'm trying to echo after every iteration of a foreach loop in PHP. The echos aren't rendering until they are all done. I've tried the suggestions from various posts but none are working. Some of my code is:
echo $epTitle . "<br>";
echo "<div>" . '<img src="' . $imgSrc . '" height="70" width="70">';
echo "<button onclick='grabVid(" . '"' . $pageUrl . '"' ..")'>Grab</button>";
I've tried the following:
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();
and other suggestions from: http://php.net/manual/en/function.flush.php and Echo 'string' while every long loop iteration (flush() not working)
Any suggestions? Thanks.
答案 0 :(得分: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();
(我不知道该示例是否有任何理由在e.currentTarget
事件处理程序中使用xhr
而不是onprogress
- 我只是按原样复制了示例。)< / p>
如果您计划执行此循环超过30秒,您的PHP脚本可能会被杀死。您可以extend the default time limit但如果您的网站有很多用户,您希望请求尽可能短,以获得最佳的服务器可用性。
这意味着重写循环,以便每次迭代都是单个HTTP请求。
答案 1 :(得分:0)
在回声后立即使用 ob_flush() 对我有用。