如题,flush测试用的网上的例子:
<?php
function shuaxing(){
ob_flush();
flush();
}
for($i = 1; $i <= 300; $i++) print(" ");
For($j = 1;$j <=20; $j++) {
echo $j."
";
shuaxing();
sleep(1);
}
?>
单独运行可行
然后index.php(同样是网上例子改的):
<html>
<head>
<script type="text/javascript">
function fun()
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","/system/ajax/testflush.php",true);
xmlhttp.send();
}
</script>
</head>
<body>
<h3>请在下面的输入框中键入字母(A - Z):</h3>
<form action="">
</form>
<button type="button" onclick="fun()">请求数据</button>
<p>Suggestions: <span id="txtHint"></span></p>
</body>
</html>
按键以后 等了20s一口气出结果
我想请教一下
php的flush在被ajax调用的时候无效吗?
如果是的话,那怎样才能实现被ajax调用时的flush呢?
看一下js中的
xmlhttp.onreadystatechange
代码ajax会等待HTTP请求响应完成的时候执行你函数中的操作。
而当你直接访问页面时,字符虽然通过
sleep(1)
后每秒一个一个打印出来,是因为字符串先进入了缓冲区
,在通过flush
函数将缓冲区
的内容交由tcp
发送到浏览器
上,但是响应还没有完成,你会发现浏览器上一直转圈圈或者进度条还在走。所以当你用Ajax请求时,循环了20次,也就是20秒后才完成了响应过程,最终把所有的结果返回。
至于你想用ajax实现这样的效果,应该使用轮询的方式。