XMLHttpRequest在PHP脚本运行时获取数据

时间:2014-05-01 10:39:23

标签: javascript php html xmlhttprequest

我正在尝试在PHP页面上轮询更新的$ val变量值,但出于某种原因,它不想在调用的html页面上显示任何内容

PHP(generator.php)脚本:

<?php

header('Content-type: text/html; charset=utf-8');
function output($val)
{
echo $val;


    flush();
    ob_flush();
    usleep(500000);
}
output('Begin... (counting to 10)');
for( $i = 0 ; $i < 10 ; $i++ )
{
    output($i+1);
}
output('End...');

?>

HTML页面:

<html>
<head>
<script type="text/javascript">

function generate(){

    try {
        xmlhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
    } catch(e) {
    }

    xmlhttp.onreadystatechange = refreshwait;
    xmlhttp.open('GET', './generator.php', true);
    xmlhttp.send('null');

}

function refreshwait() {

    if (xmlhttp.readyState == 4){

        if(xmlhttp.status == 200){

            var code = 'Finished';
            document.getElementById('view_area').innerHTML = code;  
        }

    }else{

        document.getElementById("view_area").innerHTML = xmlhttp.responseText;          
        refreshwait();
    }

}

</script>
</head>
<body>
<div id="a_form">
<form id="aform">
<input name="Generate" onClick="generate()" type="button" value="Generate Fresh File" />
</form>
</div>
<div id="view_area"></div>
</body>
</html>

我做错了什么?

,我希望看到html页面上出现1到10的计数。

1 个答案:

答案 0 :(得分:2)

我可以想到四个潜在的问题:

  1. 某些服务器(SAPI)具有内部输出缓冲功能,通常大小为4Kb。这是因为发送&#34; chunks&#34;这种尺寸通常比发送许多小件更有效。

  2. 某些浏览器会在将它们呈现给文档之前读取一定大小的块(通常是4Kb)。每次在网络流中出现几个字节时,都不会重新呈现页面,从而再次提高了性能。

  3. responseTextreadyState之前,某些浏览器(特别是较旧的IE,无法记住哪个版本)不允许访问4。显然这是一个限制,它已在较新的浏览器中删除,但它仍然是一个可能的问题。

  4. 编辑:某些浏览器要求您在调用onreadystatechange后定义.open() 。这是为了允许重用XMLHttpRequest个对象。有效地呼叫.open&#34;重置&#34;对象。

  5. 可能的解决方案:假设问题是1或2,而不是3或4,那么您可以尝试输出echo $val.str_repeat(" ",5000);以尝试绕过输出缓冲。显然这会使您的带宽膨胀,但结果看起来应该相同(因为空格在HTML中折叠)