php的flush在被ajax调用的时候无效吗?如果是的话,那怎样才能实现被ajax调用时的flush呢?

新手上路,请多包涵

如题,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呢?

阅读 3k
2 个回答

看一下js中的xmlhttp.onreadystatechange代码

xmlhttp.readyState==4 && xmlhttp.status==200

ajax会等待HTTP请求响应完成的时候执行你函数中的操作。

而当你直接访问页面时,字符虽然通过sleep(1)后每秒一个一个打印出来,是因为字符串先进入了缓冲区,在通过flush函数将缓冲区的内容交由tcp发送到浏览器上,但是响应还没有完成,你会发现浏览器上一直转圈圈或者进度条还在走。

所以当你用Ajax请求时,循环了20次,也就是20秒后才完成了响应过程,最终把所有的结果返回。

至于你想用ajax实现这样的效果,应该使用轮询的方式。

你那个请求都没有完成。。。ajax哪里会给你数据啊

推荐问题
宣传栏