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 _
相关产品推荐
相关产品推荐

