【问题标题】:XMLHttpRequest get data while PHP script is runningXMLHttpRequest 在 PHP 脚本运行时获取数据
【发布时间】:2014-05-01 18:44:51
【问题描述】:

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

【问题讨论】:

  • 去掉对flush和ob_flush的调用是否有效?
  • 尝试获取文件的完整路径或url,并在成功状态下提示结果
  • 代码正在工作尝试检查文件路径 xmlhttp.open('GET', './generator.php', true);

标签: javascript php html xmlhttprequest


【解决方案1】:

我能想到四个潜在的问题:

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

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

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

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

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

【讨论】:

  • 你是对的,输出缓冲设置超出了 php 脚本的输出。谢谢你,我自己要花很长时间才能弄清楚。
  • 我认为 php 中的“flush”会解决这个问题。是否有另一种方法可以在不使用 htaccess 或更改 php.ini 的情况下解决此问题?
  • 我不知道,抱歉。 HTTP 并不是真正为这种事情而设计的。
猜你喜欢
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
相关资源
最近更新 更多