[英]XMLHttpRequest get data while PHP script is running
我試圖在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>
我究竟做錯了什么? 因為php正在運行,我希望看到html頁面上出現1到10的計數。
我可以想到四個潛在的問題:
某些服務器(SAPI)具有內部輸出緩沖功能,通常大小為4Kb。 這是因為發送這種大小的“塊”通常比發送許多較小的塊更有效。
某些瀏覽器在將它們呈現給文檔之前將讀取特定大小的塊(再次,通常為4Kb)。 這通過每次在網絡流中出現幾個字節時不重新呈現頁面而再次提高了性能。
有些瀏覽器(特別是較舊的IE,不記得哪個版本)在readyState
為4
之前不允許訪問responseText
。 顯然這是一個限制,它已在較新的瀏覽器中刪除,但它仍然是一個可能的問題。
編輯:有些瀏覽器要求您在調用.open()
后定義onreadystatechange
。 這是為了允許重用XMLHttpRequest
對象。 調用.open
有效地“重置”對象。
可能的解決方案:假設問題是1或2,而不是3或4,那么你可以嘗試輸出echo $val.str_repeat(" ",5000);
嘗試規避輸出緩沖。 顯然這會使你的帶寬膨脹,但結果應該看起來一樣(因為空格在HTML中折疊)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.