dpxua26604 2014-05-01 10:39
浏览 97
已采纳

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

I am trying to poll a PHP page for an updated $val variable value, but for some reason it doesn't want to show anything on the calling html page

PHP (generator.php) script:

<?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 page:

<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>

What am I doing wrong? I am expecting to see a count from 1 to 10 appear on the html page as the php is running.

  • 写回答

1条回答 默认 最新

  • dongzang7182 2014-05-01 10:44
    关注

    I can think of four potential issues:

    1. Some servers (SAPIs) feature internal output buffering, typically to a size of 4Kb. This is because sending "chunks" of this size is generally more efficient than sending many smaller pieces.

    2. Some browsers will read chunks of a certain size (again, typically 4Kb) before rendering them to the document. This again improves performance by not re-rendering the page every time a few bytes happen to show up in the network stream.

    3. Some browsers (particularly older IE, can't remember which version) do not allow access to responseText until the readyState is 4. Obviously this is a limitation, and it has been removed in newer browsers, but it's still a possible problem.

    4. EDIT: Some browsers require you to define onreadystatechange after calling .open(). This is to allow reuse of XMLHttpRequest objects. Calling .open effectively "resets" the object.

    Possible solution: Assuming the problem is 1 or 2, rather than 3 or 4, then you can try outputting echo $val.str_repeat(" ",5000); to try and circumvent the output buffering. Obviously this will bloat your bandwidth, but the result should look the same (because spaces are collapsed in HTML)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?