You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

setInterval结合file_get_contents不生效,Highcharts速度仪表盘数据不更新问题

问题根源

PHP为服务端执行的脚本,仅在页面首次被请求时在树莓派服务器上运行一次,你写在setInterval参数内的<?=file_get_contents("../../../sys/class/thermal/thermal_zone0/temp");?>只会在页面生成时读取一次温度值,前端JavaScript运行时拿到的是固定的初始值,不会反复触发服务端读取文件的操作,因此数值不会更新。
同时你代码中tempCpudata函数内部重新用var声明了newVal,导致全局的newVal变量被局部变量覆盖,历史值无法累积更新。

解决方案

步骤1:新增独立的温度读取API接口

在你的网站目录下新建get_temp.php文件,代码如下:

<?php
// 禁止浏览器缓存返回结果
header("Cache-Control: no-cache, must-revalidate");
header("Content-Type: text/plain");
// 读取温度文件,原始值为千分之一摄氏度,转换为常用的摄氏度单位
$temp = intval(file_get_contents("/sys/class/thermal/thermal_zone0/temp")) / 1000;
echo $temp;
?>

注:需确保PHP运行用户(通常为www-data)拥有读取温度文件的权限,可执行sudo chmod o+r /sys/class/thermal/thermal_zone0/temp临时授权,或配置对应的用户组权限避免重启后失效。

步骤2:修改前端JavaScript代码

替换原有setInterval定义和tempCpudata函数的代码,改为每次定时器触发时通过AJAX请求最新温度值再更新仪表盘:

var newVal = 0;
// 每500ms请求一次最新温度
setInterval(tempCpudata, 500);

function tempCpudata() {
    if (!chartSpeed) return
    // 发起AJAX请求获取最新温度,加时间戳参数避免缓存
    $.get('get_temp.php?t=' + Date.now(), function(temp) {
        var p = chartSpeed.series[0].points[0];
        var inc = 1;
        // 去掉var,直接操作全局newVal
        newVal = newVal + inc;
        p.update(parseFloat(temp));
        console.log('当前温度:', temp);
        console.log('newVal:', newVal);
    })
}

内容的提问来源于stack exchange,提问作者PommeGolden _

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 13:06:04