通过PHP实现HTML向Python脚本传参及树莓派GPIO控制问题排查
我来帮你搞定这个问题!你要实现的是网页输入数字后触发树莓派GPIO定时开关,核心就是让PHP把表单里的数字传给Python脚本,再由Python控制GPIO引脚。结合你用Apache+PHP7的环境,我给你一套完整的可运行方案,连容易踩坑的权限问题都帮你考虑到了:
1. 完善index.php的表单与处理逻辑
把你的表单代码替换成下面的版本,它会处理POST请求,调用Python脚本并反馈执行状态:
<!DOCTYPE html> <html> <head> <title>RPI GPIO 定时控制器</title> </head> <body> <h1>设置GPIO开启时长(秒)</h1> <form action="index.php" method="post"> <input type="number" name="seconds" min="1" required placeholder="请输入正整数"> <button type="submit">启动计时器</button> </form> <?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $seconds = intval($_POST['seconds']); // 校验输入为正整数 if ($seconds > 0) { // 务必使用Python脚本的绝对路径,避免路径问题 $pythonScript = '/var/www/html/gpio_timer.py'; // 执行脚本并捕获输出(包括错误信息,方便调试) $output = shell_exec("python3 $pythonScript $seconds 2>&1"); echo "<h2>执行状态:</h2>"; echo "<pre>$output</pre>"; } else { echo "<p style='color:red'>请输入大于0的正整数!</p>"; } } ?> </body> </html>
2. 编写Python GPIO控制脚本(gpio_timer.py)
在/var/www/html/目录下创建这个脚本,负责接收时长参数并控制GPIO:
import sys import time import RPi.GPIO as GPIO # 配置GPIO模式(这里用BCM编号,你可以根据自己的引脚改成BOARD模式) GPIO.setmode(GPIO.BCM) # 定义要控制的GPIO引脚(示例用GPIO18,你可以替换成自己的引脚) TARGET_PIN = 18 # 设置引脚为输出模式,初始电平为低(关闭状态) GPIO.setup(TARGET_PIN, GPIO.OUT, initial=GPIO.LOW) try: # 从命令行获取传入的时长参数 if len(sys.argv) != 2: print("错误:请传入且仅传入一个数字(时长,单位秒)") sys.exit(1) duration = int(sys.argv[1]) if duration <= 0: print("错误:时长必须是正整数") sys.exit(1) print(f"正在将GPIO{TARGET_PIN}开启,持续{duration}秒...") GPIO.output(TARGET_PIN, GPIO.HIGH) time.sleep(duration) GPIO.output(TARGET_PIN, GPIO.LOW) print(f"GPIO{TARGET_PIN}已成功关闭!") except ValueError: print("错误:输入无效,请输入整数") except Exception as e: print(f"发生未知错误:{str(e)}") finally: # 无论成功失败,都清理GPIO资源,避免引脚状态异常 GPIO.cleanup()
3. 关键权限配置(必做!)
Apache运行在www-data用户下,必须给它足够的权限才能控制GPIO和执行脚本:
- 将
www-data添加到GPIO组:
sudo usermod -a -G gpio www-data
- 给Python脚本添加执行权限:
sudo chmod +x /var/www/html/gpio_timer.py
- 确保脚本归
www-data所有:
sudo chown www-data:www-data /var/www/html/gpio_timer.py
- 重启Apache让权限生效:
sudo systemctl restart apache2
4. 常见问题排查
如果还是无法运行,按以下步骤排查:
- 确认RPi.GPIO库已安装:
sudo pip3 install RPi.GPIO
- 检查PHP是否禁用了执行命令的函数:打开对应版本的PHP配置文件(比如
/etc/php/7.3/apache2/php.ini),搜索disable_functions,确保里面没有exec、shell_exec,如果有就删除后重启Apache。 - 模拟Apache环境测试脚本:用
www-data用户直接执行脚本,验证脚本本身是否正常:
sudo -u www-data python3 /var/www/html/gpio_timer.py 5
- 查看Apache错误日志:
/var/log/apache2/error.log里会记录PHP执行脚本时的错误信息,帮你快速定位问题。
内容的提问来源于stack exchange,提问作者Bradderz
相关产品推荐
相关产品推荐

