0

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.

3
  • Does it work if you remove the calls to flush and ob_flush? Commented May 1, 2014 at 10:45
  • try to full path or url of file and alert result in success state Commented May 1, 2014 at 10:45
  • code is working try to check file path xmlhttp.open('GET', './generator.php', true); Commented May 1, 2014 at 10:49

1 Answer 1

2

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)

Sign up to request clarification or add additional context in comments.

3 Comments

You are right, output buffering is set beyond what was being output by the php script. Thanks for that, it would've taken me ages to figure it out myself.
I thought "flush" in php would take care of that problem. Is there another way to fix this without using htaccess or altering php.ini?
Not that I'm aware of, sorry. HTTP isn't really designed for that kind of thing.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.