如何通过jQuery与PHP获取Python脚本实时值,实现网页动态显示温度?
解决树莓派网页实时显示温度的问题
我来帮你搞定这个实时温度显示的问题,咱们先拆解下你遇到的两个核心问题,再一步步解决:
问题根源分析
- 前端定时器只拿到一次温度:你可能是在页面加载时仅请求了一次温度数据,之后的定时器循环只是重复使用第一次的结果,并没有重新向服务器发起请求获取最新值。而且前端浏览器本身没法直接执行服务器上的Python脚本,所以循环里的
console.log能正常输出,但温度不会更新。 - PHP脚本仅刷新时运行:PHP是服务器端脚本,只有当浏览器主动请求页面(比如刷新)时才会执行,它没法主动推送数据给前端,所以得靠前端主动“询问”服务器要最新温度。
具体解决方案
1. 前端用AJAX轮询获取最新温度
修改你的前端代码,让定时器每隔5秒就向服务器发起一次请求,拿到最新温度后更新页面显示。这里用原生JavaScript的fetch API来实现:
// 定义获取温度并更新页面的函数 function updateTemperature() { // 请求后端的温度接口 fetch('get_temp.php') .then(response => { if (!response.ok) { throw new Error('请求失败'); } return response.text(); }) .then(tempValue => { console.log('最新温度:', tempValue); // 把温度显示到页面的指定元素里,比如你有个id为temp-display的元素 document.getElementById('temp-display').textContent = `当前温度: ${tempValue} °C`; }) .catch(error => { console.error('获取温度出错:', error); }); } // 页面加载完成后先执行一次,然后每5秒自动更新 window.onload = function() { updateTemperature(); setInterval(updateTemperature, 5000); };
2. 后端写一个专门的温度接口(get_temp.php)
这个PHP脚本负责调用你的Python脚本获取温度,或者直接从MySQL里读取最新的温度记录(看你Python脚本的逻辑):
方式1:直接调用Python脚本返回温度
如果你的31856.py脚本是直接输出温度值(比如print(temp)),可以用这个方式:
<?php // 调用Python脚本并获取输出 $temperature = shell_exec('sudo python /var/www/html/31856.py'); // 清理输出内容,去掉多余的换行、空格 $temperature = trim($temperature); // 返回温度值给前端 echo $temperature; ?>
方式2:从MySQL读取最新温度
如果你的Python脚本是把温度写入MySQL表,那直接查数据库效率更高:
<?php // 连接数据库(替换成你的数据库信息) $dbHost = 'localhost'; $dbUser = '你的数据库用户名'; $dbPass = '你的数据库密码'; $dbName = '你的数据库名'; $conn = mysqli_connect($dbHost, $dbUser, $dbPass, $dbName); if (!$conn) { die('数据库连接失败: ' . mysqli_connect_error()); } // 查询最新的温度记录 $query = "SELECT temperature FROM 你的温度表名 ORDER BY 时间戳字段 DESC LIMIT 1"; $result = mysqli_query($conn, $query); if ($row = mysqli_fetch_assoc($result)) { echo $row['temperature']; } else { echo '暂无数据'; } mysqli_close($conn); ?>
3. 解决sudo执行Python脚本的权限问题
默认情况下,网页服务器的运行用户(比如www-data)没有sudo权限,所以直接用sudo会执行失败。你需要给www-data授权:
- 执行
sudo visudo打开sudo配置文件 - 在文件末尾添加一行(注意替换成你的Python脚本路径):
www-data ALL=(ALL) NOPASSWD: /usr/bin/python /var/www/html/31856.py - 保存退出(按
Ctrl+X,然后Y确认,回车)
这样www-data用户就能无需密码执行这个Python脚本了。
为什么之前的方法没用?
- 你之前尝试在前端循环里执行Python脚本是行不通的,前端浏览器运行在客户端,没法直接操作服务器上的文件或脚本;
- PHP的
shell_exec只有在页面被请求时才会触发,刷新页面就是发起一次新请求,而前端轮询就是让浏览器自动定时发起请求,从而实现实时更新。
内容的提问来源于stack exchange,提问作者IyaSheep
相关产品推荐
相关产品推荐

