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)

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

报告相同问题?

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度