PHP JSON为两个不同的函数返回一个响应

时间:2011-08-06 18:42:24

标签: php javascript ajax json

我有两个PHP脚本。一个充当后端,并包含一个类定义,其中包含一些函数,用于显示计算机的平均负载和RAM使用情况。另一个充当前端,它调用这些函数并将它们与一些HTML和CSS一起打印以使其看起来不错。这样可以正常工作,但除非您刷新页面,否则它不会自动更新。

我使后端能够一次返回一个函数的JSON表,使用以下代码:

<?php    
if (!empty ($_GET['q']))
{
    $status = new status();

    $query = $_GET['q'];
    $data = $status->$query();

    exit (json_encode($data));
}
?>

我使用JavaScript接收数据:(我没有使用任何框架)

function update_load()
{
    var prefix = "Load average: ";

    xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function()
    {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
        {
            var json = JSON.parse(xmlhttp.responseText);
            document.getElementById("loadavg").innerHTML = prefix + json.load;
        }
    }
    xmlhttp.open("GET", "./backend.php?q=load", true);
    xmlhttp.send();

    setTimeout ("update_load()", 10000);
}

页面提供的JSON响应有效:

{"model":"Intel Xeon 5150 @ 2.66GHz","load":"0.00 0.02 0.05"}

我有另一个功能update_ram()几乎完全相同并且在同一时间运行。这两个函数都在页面加载时运行,并且通常在第一次运行时正常工作。有时候,其中一个(通常是负载平均值)将停止工作,而是显示“未定义”,并且永远不会再次自我更新。我为这两个函数添加了alert (xmlhttp.response),后端脚本看起来就像是将update_ram()的表发送到两个函数。

我尝试在页面加载时将其中一个函数延迟一秒,所以现在这个问题不常发生,但它仍然会发生。我想我可以让它一次性返回我想要的功能,但是它会失去一些可重用性。可能导致这种情况的原因以及可以采取哪些措施来解决这个问题?

或者,我应该采取完全不同的方式吗?

2 个答案:

答案 0 :(得分:1)

如果您使用相同的全局xmlhttp变量来保存对两个XmlHttpRequests的引用,那么自然会有一个状态转换操作被混淆。使用

将其设为局部变量
function update_load()
{
   var xmlhttp ;
   ...

答案 1 :(得分:1)

您正面临范围问题,因为xmlhttp进入全局对象只需在声明中添加var即可解决您的问题,例如:

var xmlhttp = new XMLHttpRequest();

或您的onreadystatechange处理程序不使用xmlhttp,而是使用this关键字:

xmlhttp.onreadystatechange = function()
{
  if (this.readyState == 4 && this.status == 200)
  {
    var json = JSON.parse(this.responseText);
    document.getElementById("loadavg").innerHTML = prefix + this.load;
  }
}