Entra

View Full Version : [PHP/Javascript]XMLHttpRequest e flush()


Jak696
11-11-2009, 09:07
buongiorno a tutti!

sto facendo qualche test sul mantenere aperto un canale con il server... e ci sto anche riuscendo, ma c'è un problema che non riesco proprio a capire :muro:

il codice lato client (HTML e Javascript) è il seguente:

[...]
<body>
<div id="log" style="width: 450px; height: 200px; border: 1px solid black;"></div>
<br/><input type="text" value="default" id="parameter"/>
<input type="button" onclick="connServ();" value="richiedi pagina"/>
</body>
<script type="text/javascript">
var async = new XMLHttpRequest();

function connServ(){
param = "backend.php?pass=" + document.getElementById("parameter").value;
async.open("get", param, true);
async.setRequestHeader("connection", "close");
async.send(null);
}

async.onreadystatechange = function() {
if (async.readyState == 4){
if(async.status == 200){
respo = async.responseText;
updateDiv(respo);
}
else{
respo = "Richiesta fallita!<br/>";
updateDiv(respo);
}
}
}

function updateDiv(add){
document.getElementById("log").innerHTML += add;
}
</script>
[...]

mentre la pagina "backend.php" lato server è uno script così:

<?php
echo str_repeat(' ', 1024);
flush();
while(true){
set_time_limit(20);
echo 'OK - ' . $_GET['pass'] . ' at ' . date("h-i-s") . '<br/>';
flush();
sleep(3);
}
?>

dove sta il problema?
l'output del server non compare, ma so che arriva sul client.
se lo lascio in esecuzione un po', al momento in cui premo F5 per fare il refresh della pagina compare per una frazione di secondo (finché non fa il refresh vero e proprio) tutto l'output nel <div>.

inoltre, includendo lo script direttamente in una pagina html (e non in una chiamata ajax) e richiamando il tutto con una cosa del tipo "backend.php?pass=test" il tutto funziona regolarmente, ogni 3 secondi stampa la mia stringa:
OK - test at 10-05-53
OK - test at 10-05-56
OK - test at 10-05-59

sembra proprio che per qualche strano motivo non aggiorni la grafica della pagina, nonostante io glielo ordini esplicitamente... dove sbaglio?

SerMagnus
11-11-2009, 10:44
permettimi, ma qual'è il tuo obiettivo?

Jak696
11-11-2009, 10:57
permettimi, ma qual'è il tuo obiettivo?
imparare :D voglio tenere aperto un canale permanente col server.
per cosa? per esempio ogni volta che cicla potrebbe controllare su un DB se c'è qualcosa di nuovo e inviarlo al client col flush()... le possibilità sono molteplici.
ora sto solo facendo un test

Jak696
12-11-2009, 08:01
up