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


PHP JSON returning one response for two different functions

我有两个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()的表发送到两个函数。

我尝试在页面加载时将其中一个函数延迟一秒,所以现在这个问题发生的频率降低了,但它仍然会发生。我想我可以让它一次返回我想要的所有函数,但这样就会失去一些可重用性。是什么导致了这种情况,我们可以做些什么来解决它?

或者,我应该用完全不同的方式来做这件事吗?

如果您使用相同的全局xmlhttp变量来保存对两个xmlhttprequest的引用,那么自然地,其中一个statechange动作将会被混淆。用

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

您正面临作用域问题,因为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;
  }
}