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

标签 javascript php html xmlhttprequest

我正在尝试轮询 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 的计数。

最佳答案

我可以想到四个潜在问题:

  1. 某些服务器 (SAPI) 具有内部输出缓冲功能,通常大小为 4Kb。这是因为发送这种大小的“ block ”通常比发送许多较小的 block 更有效。

  2. 某些浏览器会在将特定大小的 block (同样通常为 4Kb)渲染到文档之前读取它们。这再次提高了性能,因为每次网络流中出现几个字节时,不再重新渲染页面。

  3. 某些浏览器(特别是较旧的 IE,不记得是哪个版本)不允许访问 responseText直到readyState4 。显然这是一个限制,并且在较新的浏览器中已将其删除,但这仍然是一个可能的问题。

  4. 编辑:某些浏览器要求您定义 onreadystatechange 调用 .open() 后。这是为了允许重复使用 XMLHttpRequest对象。调用.open有效地“重置”对象。

可能的解决方案:假设问题是1或2,而不是3或4,那么你可以尝试输出 echo $val.str_repeat(" ",5000);尝试绕过输出缓冲。显然这会增加您的带宽,但结果应该看起来是一样的(因为 HTML 中的空格被折叠)

关于javascript - XMLHttpRequest 在 PHP 脚本运行时获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23406077/

相关文章:

javascript - 与 Google Maps Javascript API v3 一起使用时的服务使用限制

PHP - 变量的输出值

css - 数据表隐藏的 Bootstrap4 下拉列表

javascript - 如何请求 node.js 中的垃圾收集器运行?

javascript - Vue循环嵌套JSON麻烦

javascript - 获取 contenteditable 中发生 keydown 的元素

php - 如何从页面(php)获取所有网址

PHP filemtime vs MySQL 最后更新时间戳用于 CMS 中的图像缓存

html - 如何解决上传到 html 文件时图像颜色褪色的问题

html - 声明忽略 parent 填充的背景